From 8371532108f5c5e837fe791ea362893e11f10afa Mon Sep 17 00:00:00 2001 From: bm98 Date: Sat, 5 Jul 2014 22:46:58 +0200 Subject: [PATCH] Add log4net instrumentation (Win 8.1 seems to make still problems) Compiled for AnyCPU --- Form1.cs | 137 +- Joystick/ActionCls.cs | 2 + Joystick/ActionMapCls.cs | 1 + Joystick/ActionMapsCls.cs | 11 +- Joystick/ActionTree.cs | 13 + Joystick/DProfileReader.cs | 13 +- Joystick/JoystickCls.cs | 49 +- Program.cs | 22 + Properties/AssemblyInfo.cs | 4 +- SC/SCDefaultProfile.cs | 72 +- SC/SCMappings.cs | 7 + SC/SCPath.cs | 13 + SCJMapper-V2.csproj | 33 +- SCJMapper-V2.sln | 14 +- TheUser.cs | 4 + app.config | 2 - log4net.config | 34 + packages.config | 1 + .../log4net.2.0.3/lib/net10-full/log4net.dll | Bin 0 -> 299008 bytes .../log4net.2.0.3/lib/net10-full/log4net.xml | 30525 +++++++++++++++ .../log4net.2.0.3/lib/net11-full/log4net.dll | Bin 0 -> 299008 bytes .../log4net.2.0.3/lib/net11-full/log4net.xml | 30548 +++++++++++++++ .../log4net.2.0.3/lib/net20-full/log4net.dll | Bin 0 -> 303104 bytes .../log4net.2.0.3/lib/net20-full/log4net.xml | 30771 +++++++++++++++ .../lib/net35-client/log4net.dll | Bin 0 -> 307200 bytes .../lib/net35-client/log4net.xml | 31609 +++++++++++++++ .../log4net.2.0.3/lib/net35-full/log4net.dll | Bin 0 -> 311296 bytes .../log4net.2.0.3/lib/net35-full/log4net.xml | 31814 ++++++++++++++++ .../lib/net40-client/log4net.dll | Bin 0 -> 299520 bytes .../lib/net40-client/log4net.xml | 31609 +++++++++++++++ .../log4net.2.0.3/lib/net40-full/log4net.dll | Bin 0 -> 301056 bytes .../log4net.2.0.3/lib/net40-full/log4net.xml | 31814 ++++++++++++++++ packages/log4net.2.0.3/log4net.2.0.3.nupkg | Bin 0 -> 1931465 bytes 33 files changed, 219020 insertions(+), 102 deletions(-) create mode 100644 log4net.config create mode 100644 packages/log4net.2.0.3/lib/net10-full/log4net.dll create mode 100644 packages/log4net.2.0.3/lib/net10-full/log4net.xml create mode 100644 packages/log4net.2.0.3/lib/net11-full/log4net.dll create mode 100644 packages/log4net.2.0.3/lib/net11-full/log4net.xml create mode 100644 packages/log4net.2.0.3/lib/net20-full/log4net.dll create mode 100644 packages/log4net.2.0.3/lib/net20-full/log4net.xml create mode 100644 packages/log4net.2.0.3/lib/net35-client/log4net.dll create mode 100644 packages/log4net.2.0.3/lib/net35-client/log4net.xml create mode 100644 packages/log4net.2.0.3/lib/net35-full/log4net.dll create mode 100644 packages/log4net.2.0.3/lib/net35-full/log4net.xml create mode 100644 packages/log4net.2.0.3/lib/net40-client/log4net.dll create mode 100644 packages/log4net.2.0.3/lib/net40-client/log4net.xml create mode 100644 packages/log4net.2.0.3/lib/net40-full/log4net.dll create mode 100644 packages/log4net.2.0.3/lib/net40-full/log4net.xml create mode 100644 packages/log4net.2.0.3/log4net.2.0.3.nupkg diff --git a/Form1.cs b/Form1.cs index 4f8e788..e362b40 100644 --- a/Form1.cs +++ b/Form1.cs @@ -15,7 +15,9 @@ namespace SCJMapper_V2 { public partial class MainForm : Form { - private const String c_GithubLink = "https://github.com/bm98/SCJMapper-V2/releases"; + private static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod( ).DeclaringType ); + + private const String c_GithubLink = @"https://github.com/SCToolsfactory/SCJMapper-V2/releases"; private AppSettings m_AppSettings = new AppSettings( ); @@ -63,42 +65,53 @@ namespace SCJMapper_V2 /// private void MainForm_Load( object sender, System.EventArgs e ) { + log.Debug( "MainForm_Load - Entry" ); + // some applic initialization // Assign Size property, since databinding to Size doesn't work well. this.Size = m_AppSettings.FormSize; this.Location = m_AppSettings.FormLocation; - // XML RTB - rtb.SelectionTabs = new int[] { 10, 20, 30, 40, 50, 60 }; // short tabs - rtb.DragEnter += new DragEventHandler( rtb_DragEnter ); - rtb.DragDrop += new DragEventHandler( rtb_DragDrop ); - rtb.AllowDrop = true; // add Drop to rtb String version = Application.ProductVersion; // get the version information lblTitle.Text += " - V " + version.Substring( 0, version.IndexOf( ".", version.IndexOf( "." ) + 1 ) ); // get the first two elements // tooltips where needed toolTip1.SetToolTip( this.linkLblReleases, c_GithubLink ); // allow to see where the link may head + // XML RTB + log.Debug( "Loading RTB" ); + rtb.SelectionTabs = new int[] { 10, 20, 30, 40, 50, 60 }; // short tabs + rtb.DragEnter += new DragEventHandler( rtb_DragEnter ); + rtb.DragDrop += new DragEventHandler( rtb_DragDrop ); + rtb.AllowDrop = true; // add Drop to rtb // load profiles + log.Debug( "Loading Profiles" ); foreach ( String s in SCDefaultProfile.DefaultProfileNames ) { tsDDbtProfiles.DropDownItems.Add( Path.GetFileNameWithoutExtension( s ) ); } tsDDbtProfiles.Text = m_AppSettings.DefProfileName; // load mappings + log.Debug( "Loading Mappings" ); LoadMappingDD( ); tsDDbtMappings.Text = m_AppSettings.DefMappingName; // load other defaults + log.Debug( "Loading Other" ); txMappingName.Text = m_AppSettings.MyMappingName; SetRebindField( txMappingName.Text ); // Init X things - if ( !InitDirectInput( ) ) + log.Debug( "Loading DirectX" ); + if ( !InitDirectInput( ) ) { + log.Fatal( "Initializing DirectXInput failed" ); + MessageBox.Show( "Initializing DirectXInput failed - program exits now", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Information ); Close( ); + } + log.Debug( "Loading last used mapping" ); if ( SCMappings.MappingFileExists( txMappingName.Text ) ) { rtb.LoadFile( SCMappings.MappingFileName( txMappingName.Text ), RichTextBoxStreamType.PlainText ); InitActionTree( false ); @@ -107,10 +120,12 @@ namespace SCJMapper_V2 txMappingName.BackColor = MyColors.SuccessColor; } else { + log.WarnFormat( "Last used mapping not available ({0})", txMappingName.Text ); txMappingName.BackColor = MyColors.ErrorColor; } // poll the XInput + log.Debug( "Start XInput polling" ); timer1.Start( ); // this one polls the joysticks to show the props } @@ -120,6 +135,7 @@ namespace SCJMapper_V2 /// private void buttonExit_Click( object sender, System.EventArgs e ) { + log.Debug( "Shutting down now..." ); Close( ); } @@ -182,8 +198,8 @@ namespace SCJMapper_V2 } } catch ( Exception Ex ) { + log.Error( "Ex DrawItem", Ex ); MessageBox.Show( Ex.Message.ToString( ), "Error Occured", MessageBoxButtons.OK, MessageBoxIcon.Information ); - } } @@ -195,6 +211,8 @@ namespace SCJMapper_V2 /// private void InitActionTree( Boolean addDefaultBinding ) { + log.Debug( "InitActionTree - Entry" ); + // build TreeView and the ActionMaps m_AT = new ActionTree( ); m_AT.Ctrl = treeView1; // the ActionTree owns the TreeView control @@ -206,65 +224,86 @@ namespace SCJMapper_V2 if ( tc1.TabCount > 2 ) { cbJs3.SelectedIndex = 2; m_AT.ActionMaps.js3 = cbJs3.Text; } } + /// /// Aquire the DInput joystick devices /// /// public bool InitDirectInput( ) { + log.Debug( "Entry" ); + // Enumerate joysticks in the system. int tabs = 0; cbJs1.Items.Clear( ); cbJs2.Items.Clear( ); cbJs3.Items.Clear( ); // JS dropdowns init - // Initialize DirectInput - var directInput = new DirectInput( ); + try { + // Initialize DirectInput + log.Debug( "Instantiate DirectInput" ); + var directInput = new DirectInput( ); + + // scan the Input for attached devices + log.Debug( "Scan GameControl devices" ); + foreach ( DeviceInstance instance in directInput.GetDevices( DeviceClass.GameControl, DeviceEnumerationFlags.AttachedOnly ) ) { + + // Create the device interface + log.Debug( "Create the device interface" ); + Joystick jsDevice = new Joystick( directInput, instance.InstanceGuid ); + JoystickCls js = null; + log.DebugFormat( "Create the device interface for: {0}", jsDevice.Information.ProductName ); + + // we have the first tab made as reference so TabPage[0] already exists + if ( tabs == 0 ) { + // first panel - The Tab content exists already + log.Debug( "Add first Joystick panel" ); + js = new JoystickCls( jsDevice, this, UC_JoyPanel ); // does all device related activities for that particular item + } + else { + log.Debug( "Add next Joystick panel" ); + // setup the further tab contents along the reference one in TabPage[0] (the control named UC_JoyPanel) + tc1.TabPages.Add( "Joystick " + ( tabs + 1 ).ToString( ) ); + UC_JoyPanel uUC_JoyPanelNew = new UC_JoyPanel( ); + tc1.TabPages[tabs].Controls.Add( uUC_JoyPanelNew ); + uUC_JoyPanelNew.Size = UC_JoyPanel.Size; + uUC_JoyPanelNew.Location = UC_JoyPanel.Location; + log.Debug( "Create Joystick instance" ); + js = new JoystickCls( jsDevice, this, uUC_JoyPanelNew ); // does all device related activities for that particular item + } + m_JS.Add( js ); // add to joystick list - // scan the Input for attached devices - foreach ( DeviceInstance instance in directInput.GetDevices( DeviceClass.GameControl, DeviceEnumerationFlags.AttachedOnly ) ) { + tc1.TabPages[tabs].Tag = js.DevName; // used to find the tab via JS mapping + tc1.TabPages[tabs].BackColor = MyColors.JColor[tabs]; // each tab has its own color + cbJs1.Items.Add( js.DevName ); cbJs2.Items.Add( js.DevName ); cbJs3.Items.Add( js.DevName ); // populate DropDowns with the JS name - // Create the device interface - Joystick jsDevice = new Joystick( directInput, instance.InstanceGuid ); - JoystickCls js = null; + // next tab + tabs++; + if ( tabs == 8 ) break; // cannot load more JSticks than predefined Tabs + } + log.DebugFormat( "Added {0} GameControl devices", tabs ); - // we have the first tab made as reference so TabPage[0] already exists - if ( tabs == 0 ) { - // first panel - The Tab content exists already - js = new JoystickCls( jsDevice, this, UC_JoyPanel ); // does all device related activities for that particular item + /* + // TEST CREATE ALL 8 TABS + for ( int i=(tabs+1); i < 9; i++ ) { + tc1.TabPages.Add( "Joystick " + i.ToString( ) ); } - else { - // setup the further tab contents along the reference one in TabPage[0] (the control named UC_JoyPanel) - tc1.TabPages.Add( "Joystick " + ( tabs + 1 ).ToString( ) ); - UC_JoyPanel uUC_JoyPanelNew = new UC_JoyPanel( ); - tc1.TabPages[tabs].Controls.Add( uUC_JoyPanelNew ); - uUC_JoyPanelNew.Size = UC_JoyPanel.Size; - uUC_JoyPanelNew.Location = UC_JoyPanel.Location; - js = new JoystickCls( jsDevice, this, uUC_JoyPanelNew ); // does all device related activities for that particular item + */ + + if ( tabs == 0 ) { + log.Warn( "Unable to find and/or create any joystick devices." ); + MessageBox.Show( "Unable to create a joystick device. Program will exit.", "No joystick found", MessageBoxButtons.OK, MessageBoxIcon.Information ); + return false; } - m_JS.Add( js ); // add to joystick list - tc1.TabPages[tabs].Tag = js.DevName; // used to find the tab via JS mapping - tc1.TabPages[tabs].BackColor = MyColors.JColor[tabs]; // each tab has its own color - cbJs1.Items.Add( js.DevName ); cbJs2.Items.Add( js.DevName ); cbJs3.Items.Add( js.DevName ); // populate DropDowns with the JS name + // load the profile items from the XML + log.Debug( "Init ActionTree" ); + InitActionTree( true ); - // next tab - tabs++; - if ( tabs == 8 ) break; // cannot load more JSticks than predefined Tabs - } - /* - // TEST CREATE ALL 8 TABS - for ( int i=(tabs+1); i < 9; i++ ) { - tc1.TabPages.Add( "Joystick " + i.ToString( ) ); } - */ - - if ( tabs == 0 ) { - MessageBox.Show( "Unable to create a joystick device. Program will exit.", "No joystick found" ); + catch ( Exception ex ) { + log.Debug( "InitDirectInput failed unexpetedly", ex ); return false; } - // load the profile items from the XML - InitActionTree( true ); - return true; } @@ -289,6 +328,8 @@ namespace SCJMapper_V2 /// private void Grab( ) { + log.Debug( "Grab - Entry" ); + m_AT.ActionMaps.fromXML( rtb.Text ); m_AT.ReloadCtrl( ); // JS mapping for the first 3 items can be changed and reloaded from XML @@ -314,6 +355,8 @@ namespace SCJMapper_V2 /// private void Dump( ) { + log.Debug( "Dump - Entry" ); + rtb.Text = String.Format( "\n{1}", DateTime.Now, m_AT.ActionMaps.toXML( ) ); btDump.BackColor = btClear.BackColor; btDump.UseVisualStyleBackColor = btClear.UseVisualStyleBackColor; // neutral again @@ -333,6 +376,8 @@ namespace SCJMapper_V2 private void MainForm_FormClosing( object sender, FormClosingEventArgs e ) { + log.Debug( "MainForm_FormClosing - Entry" ); + m_AppSettings.FormSize = this.Size; m_AppSettings.FormLocation = this.Location; m_AppSettings.Save( ); diff --git a/Joystick/ActionCls.cs b/Joystick/ActionCls.cs index 864d743..8528543 100644 --- a/Joystick/ActionCls.cs +++ b/Joystick/ActionCls.cs @@ -15,6 +15,8 @@ namespace SCJMapper_V2 /// class ActionCls { + private static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod( ).DeclaringType ); + // Static items to have this mapping in only one place /// diff --git a/Joystick/ActionMapCls.cs b/Joystick/ActionMapCls.cs index 999c15a..a3b65b7 100644 --- a/Joystick/ActionMapCls.cs +++ b/Joystick/ActionMapCls.cs @@ -20,6 +20,7 @@ namespace SCJMapper_V2 /// class ActionMapCls : List { + private static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod( ).DeclaringType ); public String name { get; set; } diff --git a/Joystick/ActionMapsCls.cs b/Joystick/ActionMapsCls.cs index 46cea9c..e9e3c04 100644 --- a/Joystick/ActionMapsCls.cs +++ b/Joystick/ActionMapsCls.cs @@ -20,6 +20,9 @@ namespace SCJMapper_V2 /// class ActionMapsCls : List { + private static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod( ).DeclaringType ); + + public String version { get; set; } // own additions for JS mapping - should not harm.. public String js1 { get; set; } @@ -47,6 +50,8 @@ namespace SCJMapper_V2 /// private void Merge( ActionMapCls newAcm ) { + log.Debug( "Merge - Entry" ); + // do we find an actionmap like the new one in our list ? ActionMapCls ACM = this.Find( delegate( ActionMapCls acm ) { return acm.name == newAcm.name; @@ -66,7 +71,9 @@ namespace SCJMapper_V2 /// the action as XML fragment public String toXML( ) { - String r = String.Format( "True if an action was decoded public Boolean fromXML( String xml ) { + log.Debug( "fromXML - Entry" ); + XmlReaderSettings settings = new XmlReaderSettings( ); settings.ConformanceLevel = ConformanceLevel.Fragment; settings.IgnoreWhitespace = true; diff --git a/Joystick/ActionTree.cs b/Joystick/ActionTree.cs index 8587c15..36d62ad 100644 --- a/Joystick/ActionTree.cs +++ b/Joystick/ActionTree.cs @@ -14,6 +14,7 @@ namespace SCJMapper_V2 /// class ActionTree { + private static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod( ).DeclaringType ); public ActionMapsCls ActionMaps { get; set; } // the Action Maps and Actions @@ -59,6 +60,8 @@ namespace SCJMapper_V2 /// private void ApplyFilter( ) { + log.Debug( "ApplyFilter - Entry" ); + TreeNode topNode = null; // allow to backup the view - will carry the first node items Ctrl.BeginUpdate( ); @@ -126,6 +129,8 @@ namespace SCJMapper_V2 /// True if default mappings should be carried on public void LoadTree( String defaultProfileName, Boolean applyDefaults ) { + log.Debug( "LoadTree - Entry" ); + TreeNode tn = null; TreeNode[] cnl = { }; TreeNode cn = null; @@ -218,6 +223,8 @@ namespace SCJMapper_V2 /// The new Text property public void UpdateSelectedItem( String input ) { + log.Debug( "UpdateSelectedItem - Entry" ); + if ( Ctrl.SelectedNode == null ) return; // applies only to ActionNodes @@ -262,6 +269,8 @@ namespace SCJMapper_V2 /// public void ReloadCtrl( ) { + log.Debug( "ReloadCtrl - Entry" ); + foreach ( ActionMapCls acm in ActionMaps ) { try { TreeNode amTn = m_MasterTree.Nodes[acm.name]; // get the map node @@ -303,6 +312,8 @@ namespace SCJMapper_V2 /// The string to find public void FindCtrl( String ctrl ) { + log.Debug( "FindCtrl - Entry" ); + Boolean found = false; foreach ( TreeNode tn in Ctrl.Nodes ) { // have to search nodes of nodes @@ -325,6 +336,8 @@ namespace SCJMapper_V2 /// public String ReportActions( ) { + log.Debug( "FindCtrl - ReportActions" ); + String repList = ""; // JS assignments if ( !String.IsNullOrEmpty( ActionMaps.js1 ) ) repList += String.Format( "** js1 = {0}\n", ActionMaps.js1 ); diff --git a/Joystick/DProfileReader.cs b/Joystick/DProfileReader.cs index 5136f62..1b1d685 100644 --- a/Joystick/DProfileReader.cs +++ b/Joystick/DProfileReader.cs @@ -11,6 +11,8 @@ namespace SCJMapper_V2 /// class DProfileReader { + private static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod( ).DeclaringType ); + public Boolean ValidContent { get; set; } private Stack m_nodeNameStack = null; // element name stack - keeping track where we are @@ -29,7 +31,7 @@ namespace SCJMapper_V2 public String name { get; set; } // the action name public String input { get; set; } // the input method K,J,X,P private String m_defBinding = ""; - public String defBinding { get { return m_defBinding;} set { m_defBinding = value.Trim();} } // need to clean this one, found spaces... + public String defBinding { get { return m_defBinding; } set { m_defBinding = value.Trim( ); } } // need to clean this one, found spaces... public String keyName { get { return input + name; } } // prep for TreView usage - create a key from input+name } @@ -59,6 +61,8 @@ namespace SCJMapper_V2 { get { + log.Debug( "CSVMap - Entry" ); + String buf = ""; foreach ( ActionMap am in m_aMap.Values ) { buf += am.name + ";"; @@ -266,6 +270,8 @@ namespace SCJMapper_V2 /// private Boolean ReadXML( XmlReader xr ) { + log.Debug( "ReadXML - Entry" ); + Boolean retVal = true; try { @@ -295,8 +301,9 @@ namespace SCJMapper_V2 return false; } - catch { + catch ( Exception ex ) { // get any exceptions from reading + log.Error( "ReadXML - unexpected", ex ); return false; } } @@ -308,6 +315,8 @@ namespace SCJMapper_V2 /// True if an action was decoded public Boolean fromXML( String xml ) { + log.Debug( "fromXML - Entry" ); + XmlReaderSettings settings = new XmlReaderSettings( ); settings.ConformanceLevel = ConformanceLevel.Fragment; settings.IgnoreWhitespace = true; diff --git a/Joystick/JoystickCls.cs b/Joystick/JoystickCls.cs index 96ae281..a02edcf 100644 --- a/Joystick/JoystickCls.cs +++ b/Joystick/JoystickCls.cs @@ -16,6 +16,7 @@ namespace SCJMapper_V2 /// class JoystickCls { + private static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod( ).DeclaringType ); #region Static Items @@ -157,6 +158,8 @@ namespace SCJMapper_V2 /// The respective JS panel to show the properties public JoystickCls( Joystick device, Control hwnd, UC_JoyPanel panel ) { + log.DebugFormat( "ctor - Entry with {0}", device.Information.ProductName ); + m_device = device; m_hwnd = hwnd; m_jPanel = panel; @@ -171,20 +174,26 @@ namespace SCJMapper_V2 m_jPanel.nButtons = ButtonCount.ToString( ); m_jPanel.nPOVs = POVCount.ToString( ); - // Set the data format to the c_dfDIJoystick pre-defined format. - //m_device.SetDataFormat( DeviceDataFormat.Joystick ); - // Set the cooperative level for the device. - m_device.SetCooperativeLevel( m_hwnd, CooperativeLevel.Exclusive | CooperativeLevel.Foreground ); - // Enumerate all the objects on the device. - foreach ( DeviceObjectInstance d in m_device.GetObjects( ) ) { - // For axes that are returned, set the DIPROP_RANGE property for the - // enumerated axis in order to scale min/max values. - if ( ( 0 != ( d.ObjectId.Flags & DeviceObjectTypeFlags.Axis ) ) ) { - // Set the range for the axis. - m_device.Properties.Range = new InputRange( -1000, +1000 ); + log.Debug( "Get JS Objects" ); + try { + // Set the data format to the c_dfDIJoystick pre-defined format. + //m_device.SetDataFormat( DeviceDataFormat.Joystick ); + // Set the cooperative level for the device. + m_device.SetCooperativeLevel( m_hwnd, CooperativeLevel.Exclusive | CooperativeLevel.Foreground ); + // Enumerate all the objects on the device. + foreach ( DeviceObjectInstance d in m_device.GetObjects( ) ) { + // For axes that are returned, set the DIPROP_RANGE property for the + // enumerated axis in order to scale min/max values. + if ( ( 0 != ( d.ObjectId.Flags & DeviceObjectTypeFlags.Axis ) ) ) { + // Set the range for the axis. + m_device.Properties.Range = new InputRange( -1000, +1000 ); + } + // Update the controls to reflect what objects the device supports. + UpdateControls( d ); } - // Update the controls to reflect what objects the device supports. - UpdateControls( d ); + } + catch ( Exception ex ) { + log.Error( "Get JS Objects failed", ex ); } } @@ -194,8 +203,11 @@ namespace SCJMapper_V2 /// public void FinishDX( ) { - if ( null != m_device ) + if ( null != m_device ) { + log.DebugFormat( "Release DirectInput device: {0}", m_device.Information.ProductName ); m_device.Unacquire( ); + m_device = null; + } } @@ -414,11 +426,14 @@ namespace SCJMapper_V2 m_device.Acquire( ); } catch ( SharpDXException ) { - // Failed to acquire the device. - // This could be because the app doesn't have focus. - return; + // Failed to acquire the device. This could be because the app doesn't have focus. + return; // EXIT unaquired } } + else { + log.Error( "Unexpected Poll Exception", e ); + return; // EXIT see ex code + } } diff --git a/Program.cs b/Program.cs index 7eaecaa..4b4d875 100644 --- a/Program.cs +++ b/Program.cs @@ -2,20 +2,42 @@ using System.Collections.Generic; using System.Linq; using System.Windows.Forms; +using System.Configuration; + +using log4net; +using log4net.Config; +//[assembly: log4net.Config.XmlConfigurator( Watch = true )] +[assembly: log4net.Config.XmlConfigurator( ConfigFile = "log4Net.config", Watch = true )] namespace SCJMapper_V2 { static class Program { + private static readonly log4net.ILog log = log4net.LogManager.GetLogger ( System.Reflection.MethodBase.GetCurrentMethod( ).DeclaringType ); + + /* Log Levels Inc Priority + * ALL + * DEBUG + * INFO + * WARN + * ERROR + * FATAL + * OFF + * */ /// /// The main entry point for the application. /// [STAThread] static void Main( ) { + log.InfoFormat( "\n" ); + log.InfoFormat( "SCJMapper_V2 - Started" ); + Application.EnableVisualStyles( ); Application.SetCompatibleTextRenderingDefault( false ); Application.Run( new MainForm( ) ); + + log.InfoFormat( "SCJMapper_V2 - Ended\n" ); } } } diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index f7d240c..3233483 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion( "2.0.0.20" )] -[assembly: AssemblyFileVersion( "2.0.0.20" )] +[assembly: AssemblyVersion( "2.1.0.21" )] +[assembly: AssemblyFileVersion( "2.1.0.21" )] diff --git a/SC/SCDefaultProfile.cs b/SC/SCDefaultProfile.cs index b286ef9..463cfb3 100644 --- a/SC/SCDefaultProfile.cs +++ b/SC/SCDefaultProfile.cs @@ -14,6 +14,7 @@ namespace SCJMapper_V2 /// class SCDefaultProfile { + private static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod( ).DeclaringType ); /// /// Returns a list of files found that match 'defaultProfile*.xml' @@ -23,16 +24,22 @@ namespace SCJMapper_V2 { get { + log.Debug( "DefaultProfileNames - Entry" ); List retVal = new List( ); if ( File.Exists( SCPath.SCGameData_pak ) ) { using ( ZipFile zip = ZipFile.Read( SCPath.SCGameData_pak ) ) { - zip.CaseSensitiveRetrieval = false; - ICollection gdpak = zip.SelectEntries( "name = " + "'" + SCPath.DefaultProfileName + "*.xml'", SCPath.DefaultProfilePath_rel ); - if ( gdpak != null ) { - foreach ( ZipEntry ze in gdpak ) { - retVal.Add( ze.FileName ); + try { + zip.CaseSensitiveRetrieval = false; + ICollection gdpak = zip.SelectEntries( "name = " + "'" + SCPath.DefaultProfileName + "*.xml'", SCPath.DefaultProfilePath_rel ); + if ( gdpak != null ) { + foreach ( ZipEntry ze in gdpak ) { + retVal.Add( ze.FileName ); + } } } + catch ( Exception ex ) { + log.Error( "Unexpected", ex ); + } } } return retVal; @@ -46,47 +53,62 @@ namespace SCJMapper_V2 /// A string containing the file contents static public String DefaultProfile( String defaultProfileName ) { + log.Debug( "DefaultProfile - Entry" ); + String retVal = ""; - // first try to get the SC defaultProfile from the GameData.pak - retVal = ExtractDefaultProfile( defaultProfileName ); - if ( String.IsNullOrEmpty( retVal ) ) { - // second choice a defaultProfile.xml in the app dir distributed with the application ??? to be deleted ??? - if ( File.Exists( SCPath.DefaultProfileName + ".xml" ) ) { - using ( StreamReader sr = new StreamReader( SCPath.DefaultProfileName + ".xml" ) ) { - retVal = sr.ReadToEnd( ); - } + // first choice a defaultProfile.xml in the app dir distributed with the application ??? to be deleted ??? + if ( File.Exists( SCPath.DefaultProfileName + ".xml" ) ) { + using ( StreamReader sr = new StreamReader( SCPath.DefaultProfileName + ".xml" ) ) { + retVal = sr.ReadToEnd( ); + log.Info( "- Use AppDirectory defaultProfile" ); + } + } + else { + // second try to get the SC defaultProfile from the GameData.pak + retVal = ExtractDefaultProfile( defaultProfileName ); + if ( ! String.IsNullOrEmpty( retVal ) ) { + log.Info( "- Use GamePack defaultProfile" ); } - // last resort is the built in one else { + // last resort is the built in one retVal = SCJMapper_V2.Properties.Resources.defaultProfile; + log.Info( "- Use built in defaultProfile" ); } } return retVal; } + /// /// Zip Extracts the file to a string /// static private String ExtractDefaultProfile( String defaultProfileName ) { + log.Debug( "ExtractDefaultProfile - Entry" ); + String retVal = ""; if ( File.Exists( SCPath.SCGameData_pak ) ) { using ( ZipFile zip = ZipFile.Read( SCPath.SCGameData_pak ) ) { zip.CaseSensitiveRetrieval = false; - - ICollection gdpak = zip.SelectEntries( "name = " + "'" + defaultProfileName+"'", SCPath.DefaultProfilePath_rel ); - if ( gdpak != null ) { - try { - MemoryStream mst = new MemoryStream( ); - gdpak.FirstOrDefault( ).Extract( mst ); - UTF8Encoding unc = new UTF8Encoding( ); - retVal = unc.GetString( mst.ToArray( ) ); - } - catch { - retVal = ""; // clear any remanents + try { + ICollection gdpak = zip.SelectEntries( "name = " + "'" + defaultProfileName + "'", SCPath.DefaultProfilePath_rel ); + if ( gdpak != null ) { + try { + MemoryStream mst = new MemoryStream( ); + gdpak.FirstOrDefault( ).Extract( mst ); + UTF8Encoding unc = new UTF8Encoding( ); + retVal = unc.GetString( mst.ToArray( ) ); + } + catch { + retVal = ""; // clear any remanents + } } } + catch ( Exception ex ) { + log.Error( "Unexpected", ex ); + } + } } return retVal; diff --git a/SC/SCMappings.cs b/SC/SCMappings.cs index 39893b9..42cf866 100644 --- a/SC/SCMappings.cs +++ b/SC/SCMappings.cs @@ -12,6 +12,9 @@ namespace SCJMapper_V2 /// class SCMappings { + private static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod( ).DeclaringType ); + + private const String c_UserMapStartsWith = "layout_my_"; // we only allow those mapping names static private List m_scMappings = new List( ); @@ -83,12 +86,16 @@ namespace SCJMapper_V2 { get { + log.Debug( "MappingNames - Entry" ); if ( m_scMappings.Count == 0 ) { if ( Directory.Exists( SCPath.SCClientMappingPath ) ) { m_scMappings.Clear( ); m_scMappings = ( List )Directory.EnumerateFiles( SCPath.SCClientMappingPath ).ToList( ); } } + else { + log.Warn( "MappingNames - cannot find SC Mapping directory" ); + } return m_scMappings; } } diff --git a/SC/SCPath.cs b/SC/SCPath.cs index 7821c43..e5ea539 100644 --- a/SC/SCPath.cs +++ b/SC/SCPath.cs @@ -12,6 +12,7 @@ namespace SCJMapper_V2 /// class SCPath { + private static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod( ).DeclaringType ); /// /// Try to locate the launcher under "App Paths" @@ -22,8 +23,10 @@ namespace SCJMapper_V2 { String scpath = ( String )Registry.GetValue( @"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths\StarCitizen Launcher.exe", "", null ); if ( scpath != null ) { + log.Info( "SCLauncherPath1 - Found HKLM - AppPath - Launcher.exe" ); return scpath; } + log.Warn( "SCLauncherPath1 - did not found HKLM - AppPath - Launcher.exe" ); return ""; } } @@ -37,8 +40,10 @@ namespace SCJMapper_V2 { String scpath = ( String )Registry.GetValue( @"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\StarCitizen", "DisplayIcon", null ); if ( scpath != null ) { + log.Info( "SCLauncherPath2 - Found HKLM - Uninstall - StarCitizen" ); return scpath; } + log.Warn( "SCLauncherPath2 - did not found HKLM - Uninstall - StarCitizen" ); return ""; } } @@ -51,6 +56,7 @@ namespace SCJMapper_V2 { get { + log.Debug( "SCBasePath - Entry" ); String scp = SCLauncherPath1; if ( String.IsNullOrEmpty( scp ) ) { scp = SCLauncherPath2; @@ -74,6 +80,7 @@ namespace SCJMapper_V2 { get { + log.Debug( "SCInstallPath - Entry" ); return SCBasePath; } } @@ -86,6 +93,7 @@ namespace SCJMapper_V2 { get { + log.Debug( "SCClientDataPath - Entry" ); String scp = SCBasePath; if ( String.IsNullOrEmpty( scp ) ) return ""; // @@ -103,6 +111,7 @@ namespace SCJMapper_V2 { get { + log.Debug( "SCClientUSERPath - Entry" ); String scp = SCBasePath; if ( String.IsNullOrEmpty( scp ) ) return ""; // @@ -120,6 +129,7 @@ namespace SCJMapper_V2 { get { + log.Debug( "SCClientMappingPath - Entry" ); String scp = SCClientDataPath; if ( String.IsNullOrEmpty( scp ) ) return ""; // @@ -137,6 +147,7 @@ namespace SCJMapper_V2 { get { + log.Debug( "SCGameData_pak - Entry" ); String scp = SCClientDataPath; if ( String.IsNullOrEmpty( scp ) ) return ""; // @@ -153,6 +164,7 @@ namespace SCJMapper_V2 { get { + log.Debug( "DefaultProfilePath_rel - Entry" ); return @"Libs\Config"; } } @@ -164,6 +176,7 @@ namespace SCJMapper_V2 { get { + log.Debug( "DefaultProfileName - Entry" ); return @"defaultProfile"; } } diff --git a/SCJMapper-V2.csproj b/SCJMapper-V2.csproj index b82ca83..18b4d97 100644 --- a/SCJMapper-V2.csproj +++ b/SCJMapper-V2.csproj @@ -26,8 +26,8 @@ false false true - 20 - 2.0.0.%2a + 21 + 2.1.0.%2a false true @@ -56,10 +56,34 @@ SCJMapper_V2.Program + + true + bin\Debug\ + DEBUG;TRACE + full + AnyCPU + prompt + false + false + + + bin\Release\ + TRACE + true + pdbonly + AnyCPU + prompt + false + false + false + packages\DotNetZip.Reduced.1.9.1.8\lib\net20\Ionic.Zip.Reduced.dll + + packages\log4net.2.0.3\lib\net40-full\log4net.dll + $(SharpDXPackageBinDir)\SharpDX.dll @@ -125,6 +149,9 @@ + + Always + SettingsSingleFileGenerator @@ -137,8 +164,8 @@ - + diff --git a/SCJMapper-V2.sln b/SCJMapper-V2.sln index 5401c1e..391240a 100644 --- a/SCJMapper-V2.sln +++ b/SCJMapper-V2.sln @@ -5,14 +5,20 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SCJMapper-V2", "SCJMapper-V EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B5F8B339-E02E-4F6D-BF62-D776F165910F}.Debug|x86.ActiveCfg = Debug|x86 - {B5F8B339-E02E-4F6D-BF62-D776F165910F}.Debug|x86.Build.0 = Debug|x86 - {B5F8B339-E02E-4F6D-BF62-D776F165910F}.Release|x86.ActiveCfg = Release|x86 - {B5F8B339-E02E-4F6D-BF62-D776F165910F}.Release|x86.Build.0 = Release|x86 + {B5F8B339-E02E-4F6D-BF62-D776F165910F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B5F8B339-E02E-4F6D-BF62-D776F165910F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B5F8B339-E02E-4F6D-BF62-D776F165910F}.Debug|x86.ActiveCfg = Debug|Any CPU + {B5F8B339-E02E-4F6D-BF62-D776F165910F}.Debug|x86.Build.0 = Debug|Any CPU + {B5F8B339-E02E-4F6D-BF62-D776F165910F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B5F8B339-E02E-4F6D-BF62-D776F165910F}.Release|Any CPU.Build.0 = Release|Any CPU + {B5F8B339-E02E-4F6D-BF62-D776F165910F}.Release|x86.ActiveCfg = Release|Any CPU + {B5F8B339-E02E-4F6D-BF62-D776F165910F}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/TheUser.cs b/TheUser.cs index 5be37bb..f0353ab 100644 --- a/TheUser.cs +++ b/TheUser.cs @@ -12,6 +12,7 @@ namespace SCJMapper_V2 /// class TheUser { + private static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod( ).DeclaringType ); /// /// Returns the name of the Personal Program folder in My Documents @@ -22,6 +23,7 @@ namespace SCJMapper_V2 { get { + log.Debug( "UserDir - Entry" ); String docPath = Path.Combine( Environment.GetFolderPath( Environment.SpecialFolder.Personal ), Application.ProductName); if ( !Directory.Exists( docPath ) ) Directory.CreateDirectory( docPath ); return docPath; @@ -36,6 +38,8 @@ namespace SCJMapper_V2 /// A fully qualified filename static public String MappingFileName( String mapName ) { + log.Debug( "MappingFileName - Entry" ); + return Path.Combine( UserDir, mapName + ".xml" ); } diff --git a/app.config b/app.config index a397414..1eab012 100644 --- a/app.config +++ b/app.config @@ -2,7 +2,6 @@ -
@@ -15,5 +14,4 @@ - diff --git a/log4net.config b/log4net.config new file mode 100644 index 0000000..5a7e5fc --- /dev/null +++ b/log4net.config @@ -0,0 +1,34 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages.config b/packages.config index e5778dd..d24549c 100644 --- a/packages.config +++ b/packages.config @@ -1,6 +1,7 @@  + \ No newline at end of file diff --git a/packages/log4net.2.0.3/lib/net10-full/log4net.dll b/packages/log4net.2.0.3/lib/net10-full/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..2d9437854206ebaa28836176a6cbe0c25b9c0433 GIT binary patch literal 299008 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�F4mFg&FN22EXxFl>G2cD9 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 X2waB1We8k`z-0(rhQR+PA@F|ztZpb7 literal 0 HcmV?d00001 diff --git a/packages/log4net.2.0.3/lib/net10-full/log4net.xml b/packages/log4net.2.0.3/lib/net10-full/log4net.xml new file mode 100644 index 0000000..2b9904b --- /dev/null +++ b/packages/log4net.2.0.3/lib/net10-full/log4net.xml @@ -0,0 +1,30525 @@ + + + + log4net + + + + + Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Closes the appender and release resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + + If there is no threshold set, then the return value is always true. + + + + true if the meets the + requirements of this appender. + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A sub class that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + The layout of this appender. + + + See for more information. + + + + + The name of this appender. + + + See for more information. + + + + + The level threshold of this appender. + + + + There is no level threshold filtering by default. + + + See for more information. + + + + + + It is assumed and enforced that errorHandler is never null. + + + + It is assumed and enforced that errorHandler is never null. + + + See for more information. + + + + + + The first filter in the filter chain. + + + + Set to null initially. + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + StringWriter used to render events + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the threshold of this appender. + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + + The name uniquely identifies the appender. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns false. + + + + true if the appender requires a layout object, otherwise false. + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be send. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be send. + + + The subclass must override this method to process the buffered events. + + + + + + The size of the cyclic buffer used to hold the logging events. + + + Set to by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The triggering event evaluator that causes the buffer to be sent immediately. + + + The object that is used to determine if an event causes the entire + buffer to be sent immediately. This field can be null, which + indicates that event triggering is not to be done. The evaluator + can be set using the property. If this appender + has the ( property) set to + true then an must be set. + + + + + Indicates if the appender should overwrite events in the cyclic buffer + when it becomes full, or if the buffer should be flushed when the + buffer is full. + + + If this field is set to true then an must + be set. + + + + + The triggering event evaluator filters discarded events. + + + The object that is used to determine if an event that is discarded should + really be discarded or if it should be sent to the appenders. + This field can be null, which indicates that all discarded events will + be discarded. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + The events delivered to the subclass must be fixed. + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be send to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets a value indicating if only part of the logging event data + should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the + event data to be fixed and serialized. This will improve performance. + + + See for more information. + + + + + + Gets or sets a the fields that will be fixed in the event + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Creates an instance used to connect to the database. + + + This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). + + The of the object. + The connectionString output from the ResolveConnectionString method. + An instance with a valid connection string. + + + + Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey + property. + + + ConnectiongStringName is only supported on .NET 2.0 and higher. + + Additional information describing the connection string. + A connection string used to connect to the database. + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Prepares the database command and initialize the parameters. + + + + + Connects to the database. + + + + + Cleanup the existing command. + + + If true, a message will be written using LogLog.Warn if an exception is encountered when calling Dispose. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + Flag to indicate if we are using a command object + + + + Set to true when the appender is to use a prepared + statement or stored procedure to insert into the database. + + + + + + The list of objects. + + + + The list of objects. + + + + + + The security context to use for privileged calls + + + + + The that will be used + to insert logging events into a database. + + + + + The database command. + + + + + Database connection string. + + + + + The appSettings key from App.Config that contains the connection string. + + + + + String type name of the type name. + + + + + The text of the command. + + + + + The command type. + + + + + Indicates whether to use transactions when writing to the database. + + + + + Indicates whether to use transactions when writing to the database. + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + The appSettings key from App.Config that contains the connection string. + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The name of this parameter. + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + The precision for this parameter. + + + + + The scale for this parameter. + + + + + The size for this parameter. + + + + + The to use to render the + logging event into an object for this parameter. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined together to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined together not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Ansi code to reset terminal + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Add a mapping of level to color + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colours + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Target is the value of the console output stream. + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The enum of possible display attributes + + + + The following flags can be combined together to + form the ANSI color attributes. + + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + text color is light + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + The output can be in one for the following ANSI colors. + + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + An entry in the + + + + This is an abstract base class for types that are stored in the + object. + + + Nicko Cadell + + + + Default protected constructor + + + + Default protected constructor + + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialise based on their options + + + + + + The level that is the key for this mapping + + + The that is the key for this mapping + + + + Get or set the that is the key for this + mapping subclass. + + + + + + Initialize the options for the object + + + + Combine the and together + and append the attributes. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level + + + + + + The color attributes for the specified level + + + + Required property. + The color attributes for the specified level + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Creates a read-only wrapper for a AppenderCollection instance. + + list to create a readonly wrapper arround + + An AppenderCollection wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the AppenderCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the AppenderCollection class + that has the specified initial capacity. + + + The number of elements that the new AppenderCollection is initially capable of storing. + + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified AppenderCollection. + + The AppenderCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Allow subclasses to avoid our default constructors + + + + + + + Copies the entire AppenderCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire AppenderCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Adds a to the end of the AppenderCollection. + + The to be added to the end of the AppenderCollection. + The index at which the value has been added. + + + + Removes all elements from the AppenderCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the AppenderCollection. + + The to check for. + true if is found in the AppenderCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the AppenderCollection. + + The to locate in the AppenderCollection. + + The zero-based index of the first occurrence of + in the entire AppenderCollection, if found; otherwise, -1. + + + + + Inserts an element into the AppenderCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the AppenderCollection. + + The to remove from the AppenderCollection. + + The specified was not found in the AppenderCollection. + + + + + Removes the element at the specified index of the AppenderCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Returns an enumerator that can iterate through the AppenderCollection. + + An for the entire AppenderCollection. + + + + Adds the elements of another AppenderCollection to the current AppenderCollection. + + The AppenderCollection whose elements should be added to the end of the current AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a array to the current AppenderCollection. + + The array whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a collection to the current AppenderCollection. + + The collection whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Gets the number of elements actually contained in the AppenderCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Gets or sets the number of elements the AppenderCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + + + + + Appends log events to the ASP.NET system. + + + + + Diagnostic information and tracing messages that you specify are appended to the output + of the page that is sent to the requesting browser. Optionally, you can view this information + from a separate trace viewer (Trace.axd) that displays trace information for every page in a + given application. + + + Trace statements are processed and displayed only when tracing is enabled. You can control + whether tracing is displayed to a page, to the trace viewer, or both. + + + The logging event is passed to the or + method depending on the level of the logging event. + The event's logger name is the default value for the category parameter of the Write/Warn method. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the ASP.NET trace + + the event to log + + + Write the logging event to the ASP.NET trace + HttpContext.Current.Trace + (). + + + + + + Defaults to %logger + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be send. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this buffering appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Appends logging events to the console. + + + + ColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes directly to the application's attached console + not to the System.Console.Out or System.Console.Error TextWriter. + The System.Console.Out and System.Console.Error streams can be + programmatically redirected (for example NUnit does this to capture program output). + This appender will ignore these redirections because it needs to use Win32 + API calls to colorize the output. To respect these redirections the + must be used. + + + When configuring the colored console appender, mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + combination of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + HighIntensity + + + + Rick Hobbs + Nicko Cadell + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + The console output stream writer to write to + + + + This writer is not thread safe. + + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The enum of possible color values for use with the color mapping method + + + + The following flags can be combined together to + form the colors. + + + + + + + color is blue + + + + + color is green + + + + + color is red + + + + + color is white + + + + + color is yellow + + + + + color is purple + + + + + color is cyan + + + + + color is intensified + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + The combined and suitable for + setting the console color. + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + If is true then the + is called. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Writes events to the system event log. + + + + The appender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges. + See also http://logging.apache.org/log4net/release/faq.html#trouble-EventLog + + + The EventID of the event log entry can be + set using the EventID property () + on the . + + + The Category of the event log entry can be + set using the Category property () + on the . + + + There is a limit of 32K characters for an event log message + + + When configuring the EventLogAppender a mapping can be + specified to map a logging level to an event log entry type. For example: + + + <mapping> + <level value="ERROR" /> + <eventLogEntryType value="Error" /> + </mapping> + <mapping> + <level value="DEBUG" /> + <eventLogEntryType value="Information" /> + </mapping> + + + The Level is the standard log4net logging level and eventLogEntryType can be any value + from the enum, i.e.: + + Erroran error event + Warninga warning event + Informationan informational event + + + + Aspi Havewala + Douglas de la Torre + Nicko Cadell + Gert Driesen + Thomas Voss + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class + with the specified . + + The to use with this appender. + + + Obsolete constructor. + + + + + + Add a mapping of level to - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the event log entry type for a level. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create an event log source + + + Uses different API calls under NET_2_0 + + + + + This method is called by the + method. + + the event to log + + Writes the event to the system event log using the + . + + If the event has an EventID property (see ) + set then this integer will be used as the event log event id. + + + There is a limit of 32K characters for an event log message + + + + + + Get the equivalent for a + + the Level to convert to an EventLogEntryType + The equivalent for a + + Because there are fewer applicable + values to use in logging levels than there are in the + this is a one way mapping. There is + a loss of information during the conversion. + + + + + The log name is the section in the event logs where the messages + are stored. + + + + + Name of the application to use when logging. This appears in the + application column of the event log named by . + + + + + The name of the machine which holds the event log. This is + currently only allowed to be '.' i.e. the current machine. + + + + + Mapping from level object to EventLogEntryType + + + + + The security context to use for privileged calls + + + + + The event ID to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + The event category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + The fully qualified type of the EventLogAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The maximum size supported by default. + + + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx + The 32766 documented max size is two bytes shy of 32K (I'm assuming 32766 + may leave space for a two byte null terminator of #0#0). The 32766 max + length is what the .NET 4.0 source code checks for, but this is WRONG! + Strings with a length > 31839 on Windows Vista or higher can CORRUPT + the event log! See: System.Diagnostics.EventLogInternal.InternalWriteEvent() + for the use of the 32766 max size. + + + + + The maximum size supported by a windows operating system that is vista + or newer. + + + See ReportEvent API: + http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx + ReportEvent's lpStrings parameter: + "A pointer to a buffer containing an array of + null-terminated strings that are merged into the message before Event Viewer + displays the string to the user. This parameter must be a valid pointer + (or NULL), even if wNumStrings is zero. Each string is limited to 31,839 characters." + + Going beyond the size of 31839 will (at some point) corrupt the event log on Windows + Vista or higher! It may succeed for a while...but you will eventually run into the + error: "System.ComponentModel.Win32Exception : A device attached to the system is + not functioning", and the event log will then be corrupt (I was able to corrupt + an event log using a length of 31877 on Windows 7). + + The max size for Windows Vista or higher is documented here: + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx. + Going over this size may succeed a few times but the buffer will overrun and + eventually corrupt the log (based on testing). + + The maxEventMsgSize size is based on the max buffer size of the lpStrings parameter of the ReportEvent API. + The documented max size for EventLog.WriteEntry for Windows Vista and higher is 31839, but I'm leaving room for a + terminator of #0#0, as we cannot see the source of ReportEvent (though we could use an API monitor to examine the + buffer, given enough time). + + + + + The maximum size that the operating system supports for + a event log message. + + + Used to determine the maximum string length that can be written + to the operating system event log and eventually truncate a string + that exceeds the limits. + + + + + This method determines the maximum event log message size allowed for + the current environment. + + + + + + The name of the log where messages will be stored. + + + The string name of the log where messages will be stored. + + + This is the name of the log as it appears in the Event Viewer + tree. The default value is to log into the Application + log, this is where most applications write their events. However + if you need a separate log for your application (or applications) + then you should set the appropriately. + This should not be used to distinguish your event log messages + from those of other applications, the + property should be used to distinguish events. This property should be + used to group together events into a single log. + + + + + + Property used to set the Application name. This appears in the + event logs when logging. + + + The string used to distinguish events from different sources. + + + Sets the event log source property. + + + + + This property is used to return the name of the computer to use + when accessing the event logs. Currently, this is the current + computer, denoted by a dot "." + + + The string name of the machine holding the event log that + will be logged into. + + + This property cannot be changed. It is currently set to '.' + i.e. the local machine. This may be changed in future. + + + + + Gets or sets the used to write to the EventLog. + + + The used to write to the EventLog. + + + + The system security context used to write to the EventLog. + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the EventId to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The EventID of the event log entry will normally be + set using the EventID property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Gets or sets the Category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The Category of the event log entry will normally be + set using the Category property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and its event log entry type. + + + + + + The for this entry + + + + Required property. + The for this entry + + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by + the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative models only hold a + write lock while the appender is writing a logging event () + or synchronize by using a named system wide Mutex (). + + + All locking strategies have issues and you should seriously consider using a different strategy that + avoids having multiple processes logging to the same file. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class and + sets the output destination to a new initialized + with the specified . + + The layout to use with this appender. + The to output to. + + + Obsolete constructor. + + + + + + Initializes a new instance of the class and sets + the output destination to the specified . + + The layout to use with this appender + The to output to + + The must have been previously opened. + + + + Obsolete constructor. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checks if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Writes the footer and closes the underlying . + + + + Writes the footer and closes the underlying . + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + This is the where logging events + will be written to. + + + + + Immediate flush means that the underlying + or output stream will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logging events are not actually persisted if and when the application + crashes. + + + The default value is true. + + + + + + The fully qualified type of the TextWriterAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + Default constructor + + + + Default constructor + + + + + + Construct a new appender using the layout, file and append mode. + + the layout to use with this appender + the full path to the file to write to + flag to indicate if the file should be appended to + + + Obsolete constructor. + + + + + + Construct a new appender using the layout and file specified. + The file will be appended to. + + the layout to use with this appender + the full path to the file to write to + + + Obsolete constructor. + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by sub classes that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by sub classes that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Flag to indicate if we should append to the file + or overwrite the file. The default is to append. + + + + + The name of the log file. + + + + + The encoding to use for the file stream. + + + + + The security context to use for privileged calls + + + + + The stream to log to. Has added locking semantics + + + + + The locking model to use + + + + + The fully qualified type of the FileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are three built in locking models, , and . + The first locks the file from the start of logging to the end, the + second locks only for the minimal amount of time when logging each message + and the last synchronizes processes using a named system wide Mutex. + + + The default locking model is the . + + + + + + Write only that uses the + to manage access to an underlying resource. + + + + + True asynchronous writes are not supported, the implementation forces a synchronous write. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Helper method that creates a FileStream under CurrentAppender's SecurityContext. + + + + Typically called during OpenFile or AcquireLock. + + + If the directory portion of the does not exist, it is created + via Directory.CreateDirecctory. + + + + + + + + + + Helper method to close under CurrentAppender's SecurityContext. + + + Does not set to null. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Provides cross-process file locking. + + Ron Grabowski + Steve Wranovsky + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + - and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a local syslog service. + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + The facility. The default facility is . + + + + + The message identity + + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + the current list of events that have been appended. + + + Use the method to clear the + current list of events. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets the events that have been logged. + + The events that have been logged + + + Gets the events that have been logged. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + The list of events that have been appended. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + Gets or sets a value indicating whether only part of the logging event + data should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the event + data to be fixed and stored in the appender, hereby improving performance. + + + See for more information. + + + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + Logs entries by sending network messages using the + native function. + + + + You can send messages only to names that are active + on the network. If you send the message to a user name, + that user must be logged on and running the Messenger + service to receive the message. + + + The receiver will get a top most window displaying the + messages one at a time, therefore this appender should + not be used to deliver a high volume of messages. + + + The following table lists some possible uses for this appender : + + + + + Action + Property Value(s) + + + Send a message to a user account on the local machine + + + = <name of the local machine> + + + = <user name> + + + + + Send a message to a user account on a remote machine + + + = <name of the remote machine> + + + = <user name> + + + + + Send a message to a domain user account + + + = <name of a domain controller | uninitialized> + + + = <user name> + + + + + Send a message to all the names in a workgroup or domain + + + = <workgroup name | domain name>* + + + + + Send a message from the local machine to a remote machine + + + = <name of the local machine | uninitialized> + + + = <name of the remote machine> + + + + + + + Note : security restrictions apply for sending + network messages, see + for more information. + + + + + An example configuration section to log information + using this appender from the local machine, named + LOCAL_PC, to machine OPERATOR_PC : + + + + + + + + + + Nicko Cadell + Gert Driesen + + + + The DNS or NetBIOS name of the server on which the function is to execute. + + + + + The sender of the network message. + + + + + The message alias to which the message should be sent. + + + + + The security context to use for privileged calls + + + + + Initializes the appender. + + + The default constructor initializes all fields to their default values. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified. + + + The required property was not specified. + + + + This method is called by the method. + + The event to log. + + + Sends the event using a network message. + + + + + + Sends a buffer of information to a registered message alias. + + The DNS or NetBIOS name of the server on which the function is to execute. + The message alias to which the message buffer should be sent + The originator of the message. + The message text. + The length, in bytes, of the message text. + + + The following restrictions apply for sending network messages: + + + + + Platform + Requirements + + + Windows NT + + + No special group membership is required to send a network message. + + + Admin, Accounts, Print, or Server Operator group membership is required to + successfully send a network message on a remote server. + + + + + Windows 2000 or later + + + If you send a message on a domain controller that is running Active Directory, + access is allowed or denied based on the access control list (ACL) for the securable + object. The default ACL permits only Domain Admins and Account Operators to send a network message. + + + On a member server or workstation, only Administrators and Server Operators can send a network message. + + + + + + + For more information see Security Requirements for the Network Management Functions. + + + + + If the function succeeds, the return value is zero. + + + + + + Gets or sets the sender of the message. + + + The sender of the message. + + + If this property is not specified, the message is sent from the local computer. + + + + + Gets or sets the message alias to which the message should be sent. + + + The recipient of the message. + + + This property should always be specified in order to send a message. + + + + + Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. + + + DNS or NetBIOS name of the remote server on which the function is to execute. + + + + For Windows NT 4.0 and earlier, the string should begin with \\. + + + If this property is not specified, the local computer is used. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Appends log events to the OutputDebugString system. + + + + OutputDebugStringAppender appends log events to the + OutputDebugString system. + + + The string is passed to the native OutputDebugString + function. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the output debug string API + + the event to log + + + Write the logging event to the output debug string API + + + + + + Stub for OutputDebugString native method + + the string to output + + + Stub for OutputDebugString native method + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The IP address of the remote host or multicast group to which + the logging event will be sent. + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The cached remote endpoint to which the logging events will be sent. + + + + + The TCP port number from which the will communicate. + + + + + The instance that will be used for sending the + logging events. + + + + + The encoding to use for the packet. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The cached remote endpoint to which the logging events will be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Syslog port 514 + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + The facility. The default facility is . + + + + + The message identity + + + + + Mapping from level object to syslog severity + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Delivers logging events to a remote logging sink. + + + + This Appender is designed to deliver events to a remote sink. + That is any object that implements the + interface. It delivers the events using .NET remoting. The + object to deliver events to is specified by setting the + appenders property. + + The RemotingAppender buffers events before sending them. This allows it to + make more efficient use of the remoting infrastructure. + + Once the buffer is full the events are still not sent immediately. + They are scheduled to be sent using a pool thread. The effect is that + the send occurs asynchronously. This is very important for a + number of non obvious reasons. The remoting infrastructure will + flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + Because the events are sent asynchronously using pool threads it is possible to close + this appender before all the queued events have been sent. + When closing the appender attempts to wait until all the queued events have been sent, but + this will timeout after 30 seconds regardless. + + If this appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. If the runtime terminates the threads before + the queued events have been sent then they will be lost. To ensure that all events + are sent the appender must be closed before the application exits. See + for details on how to shutdown + log4net programmatically. + + + Nicko Cadell + Gert Driesen + Daniel Cazzulino + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Send the contents of the buffer to the remote sink. + + + The events are not sent immediately. They are scheduled to be sent + using a pool thread. The effect is that the send occurs asynchronously. + This is very important for a number of non obvious reasons. The remoting + infrastructure will flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + The events to send. + + + + Override base class close. + + + + This method waits while there are queued work items. The events are + sent asynchronously using work items. These items + will be sent once a thread pool thread is available to send them, therefore + it is possible to close the appender before all the queued events have been + sent. + + This method attempts to wait until all the queued events have been sent, but this + method will timeout after 30 seconds regardless. + + If the appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. + + + + + A work item is being queued into the thread pool + + + + + A work item from the thread pool has completed + + + + + Send the contents of the buffer to the remote sink. + + + This method is designed to be used with the . + This method expects to be passed an array of + objects in the state param. + + the logging events to send + + + + The URL of the remote sink. + + + + + The local proxy (.NET remoting) for the remote logging sink. + + + + + The number of queued callbacks currently waiting or executing + + + + + Event used to signal when there are no queued work items + + + This event is set when there are no queued work items. In this + state it is safe to close the appender. + + + + + Gets or sets the URL of the well-known object that will accept + the logging events. + + + The well-known URL of the remote sink. + + + + The URL of the remoting sink that will accept logging events. + The sink must implement the + interface. + + + + + + Interface used to deliver objects to a remote sink. + + + This interface must be implemented by a remoting sink + if the is to be used + to deliver logging events to the sink. + + + + + Delivers logging events to the remote sink + + Array of events to log. + + + Delivers logging events to the remote sink + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + The fully qualified type of the RollingFileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Sets the quiet writer being used. + + + This method can be overridden by sub classes. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + + + Builds a list of filenames for all files matching the base filename plus a file + pattern. + + + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Attempts to extract a number from the end of the file name that indicates + the number of the times the file has been rolled over. + + + Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. + + + + + + + Takes a list of files and a base file name, and looks for + 'incremented' versions of the base file. Bumps the max + count up to the highest count seen. + + + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + + + + .1, .2, .3, etc. + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if is exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + This object supplies the current date/time. Allows test code to plug in + a method to control this class when testing date/time based rolling. The default + implementation uses the underlying value of DateTime.Now. + + + + + The date pattern. By default, the pattern is set to ".yyyy-MM-dd" + meaning daily rollover. + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + The default maximum file size is 10MB + + + + + There is zero backup files by default + + + + + How many sized based backups have been made so far + + + + + The rolling file count direction. + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + Value indicating whether to always log to the same file. + + + + + Value indicating whether to preserve the file name extension when rolling. + + + + + FileName provided in configuration. Used for rolling properly + + + + + The 1st of January 1970 in UTC + + + + + Gets or sets the strategy for determining the current date and time. The default + implementation is to use LocalDateTime which internally calls through to DateTime.Now. + + + An implementation of the interface which returns the current date and time. + + + + Gets or sets the used to return the current date and time. + + + The default strategy is . + + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to false, otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to preserve the file name extension when rolling. + + + true if the file name extension should be preserved. + + + + By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. + However, under Windows the new file name will loose any program associations as the + extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or + file.curSizeRollBackup.log to maintain any program associations. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + true if always should be logged to the same file, otherwise false. + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + Style of rolling to use + + + + Style of rolling to use + + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is + configured. + + + Setting this option also sets AppendToFile to + false on the RollingFileAppender, otherwise + this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an e-mail when a specific logging event occurs, typically on errors + or fatal errors. + + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Authentication and setting the server Port are only available on the MS .NET 1.1 runtime. + For these features to be enabled you need to ensure that you are using a version of + the log4net assembly that is built against the MS .NET 1.1 framework and that you are + running the your application on the MS .NET 1.1 runtime. On all other platforms only sending + unauthenticated messages to a server listening on port 25 (the default) is supported. + + + Authentication is supported by setting the property to + either or . + If using authentication then the + and properties must also be set. + + + To set the SMTP server port use the property. The default port is 25. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + Send the email message + + the body text to include in the mail + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses + that will be carbon copied (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses + that will be blind carbon copied. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of recipient e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the name of the SMTP relay mail server to use to send + the e-mail messages. + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + + + Obsolete + + + Use the BufferingAppenderSkeleton Fix methods instead + + + + Obsolete property. + + + + + + The mode to use to authentication with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + Valid Authentication mode values are: , + , and . + The default value is . When using + you must specify the + and to use to authenticate. + When using the Windows credentials for the current + thread, if impersonating, or the process will be used to authenticate. + + + + + + The username to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the username will be ignored. + + + + + + The password to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the password will be ignored. + + + + + + The port on which the SMTP server is listening + + + Server Port is only available on the MS .NET 1.1 runtime. + + The port on which the SMTP server is listening. The default + port is 25. The Port can only be changed when running on + the MS .NET 1.1 runtime. + + + + + + Gets or sets the priority of the e-mail message + + + One of the values. + + + + Sets the priority of the e-mails generated by this + appender. The default priority is . + + + If you are using this appender to report errors then + you may want to set the priority to . + + + + + + Gets or sets the subject encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Gets or sets the body encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Values for the property. + + + + SMTP authentication modes. + + + + + + No authentication + + + + + Basic authentication. + + + Requires a username and password to be supplied + + + + + Integrated authentication + + + Uses the Windows credentials from the current thread or process to authenticate. + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The security context to use for privileged calls + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages + back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored + over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + The fully qualified type of the TelnetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Create the socket handler and wait for connections + + + + + + Writes the logging event to each connected client. + + The event to log. + + + Writes the logging event to each connected client. + + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from + clients. It is threaded so that clients can connect/disconnect + asynchronously. + + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients + + the text to send + + + Sends a string message to each of the connected clients + + + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Callback used to accept a connection on the server socket + + The result of the asynchronous operation + + + On connection adds to the list of connections + if there are two many open connections you will be disconnected + + + + + + Close all network connections + + + + Make sure we close all network connections + + + + + + Test if this handler has active connections + + + true if this handler has active connections + + + + This property will be true while this handler has + active connections, that is at least one connection that + the handler will attempt to send a message to. + + + + + + Class that represents a client connected to this handler + + + + Class that represents a client connected to this handler + + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Write a string to the client + + string to send + + + Write a string to the client + + + + + + Cleanup the clients connection + + + + Close the socket connection. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is the default value for the category parameter + of the Write method. + + + Compact Framework
+ The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
+
+ Douglas de la Torre + Nicko Cadell + Gert Driesen + Ron Grabowski +
+ + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to %logger + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Assembly level attribute that specifies a domain to alias to this assembly's repository. + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's domain to its repository by + specifying this attribute with the name of the target domain. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required domains. + + + Nicko Cadell + Gert Driesen + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + + + + + Gets or sets the repository to alias to this assemby's repository. + + + The repository to alias to this assemby's repository. + + + + The name of the repository to alias to this assemby's repository. + + + + + + Initializes a new instance of the class with + the specified domain to alias to this assembly's repository. + + The domain to alias to this assemby's repository. + + + Obsolete. Use instead of . + + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + The fully qualified type of the BasicConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Initializes the log4net system with a default configuration. + + + + Initializes the log4net logging system using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the log4net system using the specified appender. + + The appender to use to log all logging events. + + + Initializes the log4net system using the specified appender. + + + + + + Initializes the log4net system using the specified appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appender. + + The repository to configure. + The appender to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Initializes the using the specified appenders. + + The repository to configure. + The appenders to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Assembly level attribute that specifies the logging domain for the assembly. + + + + DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + Assemblies are mapped to logging domains. Each domain has its own + logging repository. This attribute specified on the assembly controls + the configuration of the domain. The property specifies the name + of the domain that this assembly is a part of. The + specifies the type of the repository objects to create for the domain. If + this attribute is not specified and a is not specified + then the assembly will be part of the default shared logging domain. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Initializes a new instance of the class. + + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Initialize a new instance of the class + with the name of the domain. + + The name of the domain. + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + The repository to configure. + + + + Configures log4net using a log4net element + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The element to parse. + + + + Configures the using the specified XML + element. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration file. + + A stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Assembly level attribute to configure the . + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + Gert Driesen + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The assembly that this attribute was defined on. + The repository to configure. + + + + The fully qualified type of the XmlConfiguratorAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + The extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Class to register for the log4net section of the configuration file + + + The log4net section of the configuration file needs to have a section + handler registered. This is the section handler used. It simply returns + the XML element that is the root of the section. + + + Example of registering the log4net section handler : + + + +
+ + + log4net configuration XML goes here + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Parses the configuration section. + + The configuration settings in a corresponding parent configuration section. + The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. + The for the log4net section. + The for the log4net section. + + + Returns the containing the configuration data, + + + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + Initializes a new instance of the class + with the specified type. + + The type name of plugin to create. + + + Create the attribute with the plugin type specified. + + + Where possible use the constructor that takes a . + + + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Creates the plugin object defined by this attribute. + + + + Creates the instance of the object as + specified by this attribute. + + + The plugin object. + + + + Returns a representation of the properties of this object. + + + + Overrides base class method to + return a representation of the properties of this object. + + + A representation of the properties of this object + + + + Gets or sets the type for the plugin. + + + The type for the plugin. + + + + The type for the plugin. + + + + + + Gets or sets the type name for the plugin. + + + The type name for the plugin. + + + + The type name for the plugin. + + + Where possible use the property instead. + + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Construct provider attribute with type specified + + the type of the provider to use + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + The fully qualified type of the SecurityContextProviderAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the type of the provider to use. + + + the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration URI. + + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The must support the URI scheme specified. + + + + + + Configures log4net using the specified configuration data stream. + + A stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Maps repository names to ConfigAndWatchHandler instances to allow a particular + ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + reconfigured. + + + + + The fully qualified type of the XmlConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + Watches file for changes. This object should be disposed when no longer + needed to free system handles on the watched resources. + + + + + Initializes a new instance of the class to + watch a specified config file used to configure a repository. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + Release the handles held by the watcher and timer. + + + + + The implementation of the interface suitable + for use with the compact framework + + + + This implementation is a simple + mapping between repository name and + object. + + + The .NET Compact Framework 1.0 does not support retrieving assembly + level attributes therefore unlike the DefaultRepositorySelector + this selector does not examine the calling assembly for attributes. + + + Nicko Cadell + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to lookup to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to lookup to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all of the repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Create a new repository selector + + the type of the repositories to create, must implement + + + Create an new compact repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + throw if is null + throw if does not implement + + + + Get the for the specified assembly + + not used + The default + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Get the named + + the name of the repository to lookup + The named + + + Get the named . The default + repository is log4net-default-repository. Other repositories + must be created using the . + If the named repository does not exist an exception is thrown. + + + throw if is null + throw if the does not exist + + + + Create a new repository for the assembly specified + + not used + the type of repository to create, must implement + the repository created + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + If the is null then the + default repository type specified to the constructor is used. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Create a new repository for the repository specified + + the repository to associate with the + the type of repository to create, must implement . + If this param is null then the default repository type is used. + the repository created + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + If the named repository already exists an exception will be thrown. + + + If is null then the default + repository type specified to the constructor is used. + + + throw if is null + throw if the already exists + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + The fully qualified type of the CompactRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Notify the registered listeners that the repository has been created + + The repository that has been created + + + Raises the LoggerRepositoryCreatedEvent + event. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create an new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to lookup the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to lookup the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Create a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + The fully qualified type of the DefaultRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + An evaluator that triggers on an Exception type + + + + This evaluator will trigger if the type of the Exception + passed to + is equal to a Type in . /// + + + Drew Schaeffer + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + The type that causes the trigger to fire. + + + + + Causes subclasses of to cause the trigger to fire. + + + + + Default ctor to allow dynamic creation through a configurator. + + + + + Constructs an evaluator and initializes to trigger on + + the type that triggers this evaluator. + If true, this evaluator will trigger on subclasses of . + + + + Is this the triggering event? + + The event to check + This method returns true, if the logging event Exception + Type is . + Otherwise it returns false + + + This evaluator will trigger if the Exception Type of the event + passed to + is . + + + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement + + + + This interface supports logging events and testing if a level + is enabled for logging. + + + These methods will not throw exceptions. Note to implementor, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + Generates a logging event for the specified using + the and . + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + + + + Gets the name of the logger. + + + The name of the logger. + + + + The name of this logger + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Get the implementation behind this wrapper object. + + + The object that in implementing this object. + + + + The object that in implementing this + object. The Logger object may not + be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process + the log events. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + + + A + event is raised every time a is created. + + + + + + The created + + + + + Construct instance using specified + + the that has been created + + + Construct instance using specified + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + is the string that is written into the output log. By default + the display name is the same as the level name, but this can be used to alias levels + or to localize the log output. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + Compares levels. + + The object to compare against. + true if the objects are equal. + + + Compares the levels of instances, and + defers to base class if the target object is not a + instance. + + + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + is not a . + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + true if is greater than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + true if is less than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + true if is greater than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + true if is less than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + true if the value of is the same as the + value of ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + true if the value of is different from + the value of ; otherwise, false. + + + + Compares two levels. + + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + Compares two levels. + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + The value of this level. + + + + Gets the value of this level. + + + + + + Gets the display name of this level. + + + The display name of this level. + + + + Gets the display name of this level. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Allow subclasses to avoid our default constructors + + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + An evaluator that triggers at a threshold level + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + The threshold for triggering + + + + + Create a new evaluator using the threshold. + + + + Create a new evaluator using the threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Create a new evaluator using the specified threshold. + + the threshold to trigger at + + + Create a new evaluator using the specified threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Mapping between string name and Level object + + + + Mapping between string name and object. + This mapping is held separately for each . + The level name is case insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case insensitive + + + + + Construct the level map + + + + Construct the level map. + + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + + + Create a new Level and add it to the map + + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + Create a new Level and add it to the map + + + + + + Add a Level to the map + + the Level to add + + + Add a Level to the map + + + + + + Lookup a named level from the map + + the name of the level to lookup is taken from this level. + If the level is not set on the map then this level is added + the level in the map with the name specified + + + Lookup a named level from the map. The name of the level to lookup is taken + from the property of the + argument. + + + If no level with the specified name is found then the + argument is added to the level map + and returned. + + + + + + Lookup a by name + + The name of the Level to lookup + a Level from the map with the name specified + + + Returns the from the + map with the name specified. If the no level is + found then null is returned. + + + + + + Return all possible levels as a list of Level objects. + + all possible levels as a list of Level objects + + + Return all possible levels as a list of Level objects. + + + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + Gets the stack frames from the stack trace of the caller making the log request + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Private constructor to prevent instances. Only static methods should be used. + + + + Private constructor to prevent instances. Only static methods should be used. + + + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shutdown the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to lookup the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shutdown. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to lookup the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to lookup the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + The fully qualified type of the LoggerManager class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initialize the default repository selector + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to lookup a specific repository. + + + For the full .NET Framework, the default repository is DefaultRepositorySelector; + for the .NET Compact Framework CompactRepositorySelector is the default + repository. + + + + + + Implementation of the interface. + + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Constructs a new wrapper for the specified logger. + + The logger to wrap. + + + Constructs a new wrapper for the specified logger. + + + + + + The logger that this object is wrapping + + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + Portable data structure used by + + + + Portable data structure used by + + + Nicko Cadell + + + + The logger name. + + + + The logger name. + + + + + + Level of logging event. + + + + Level of logging event. Level cannot be Serializable + because it is a flyweight. Due to its special serialization it + cannot be declared final either. + + + + + + The application supplied message. + + + + The application supplied message of logging event. + + + + + + The name of thread + + + + The name of thread in which this logging event was generated + + + + + + The time the event was logged + + + + The TimeStamp is stored in the local time zone for this computer. + + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, + like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + Flags passed to the property + + + + Flags passed to the property + + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties. Active properties must implement in order to be eligible for fixing. + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + The level of this event. + The message of this event. + The exception for this event. + + + Except , and , + all fields of LoggingEvent are filled when actually needed. Call + to cache all data locally + to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The method must be called during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Obsolete. Use instead. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix instance fields that hold volatile data. + + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + incurred by calling but it + is essential to maintaining data consistency. + + + Calling is equivalent to + calling passing the parameter + false. + + + See for more + information. + + + + + + Fixes instance fields that hold volatile data. + + Set to true to not fix data that takes a long time to fix. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + The param controls the data that + is fixed. Some of the data that can be fixed takes a long time to + generate, therefore if you do not require those settings to be fixed + they can be ignored by setting the param + to true. This setting will ignore the + and settings. + + + Set to false to ensure that all + settings are fixed. + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Lookup a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine together properties from + several different contexts in the following order: + + + this events properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The application supplied message of logging event. + + + + + The exception that was thrown. + + + This is not serialized. The string representation + is serialized instead. + + + + + The repository that generated the logging event + + + This is not serialized. + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler + changes in the caching strategy. + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored in the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the of the logging event. + + + The of the logging event. + + + + Gets the of the logging event. + + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in the local time zone for this computer. + + + + + + Gets the name of the logger that logged the event. + + + The name of the logger that logged the event. + + + + Gets the name of the logger that logged the event. + + + + + + Gets the location information for this logging event. + + + The location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + Gets the message object used to initialize this event. + Note that this event may not have a valid message object. + If the event is serialized the message object will not + be transferred. To get the text of the message the + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + Gets the exception object used to initialize this event. + Note that this event may not have a valid exception object. + If the event is serialized the exception object will not + be transferred. To get the text of the exception the + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + The string name of the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + The AppDomain friendly name. + + + + Gets the AppDomain friendly name. + + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + The fixed fields in this event + + + The set of fields that are fixed in this event + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Log a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + constructs a method item for an unknown method. + + + + + constructs a method item from the name of the method. + + + + + + constructs a method item from the name of the method and its parameters. + + + + + + + constructs a method item from a method base by determining the method name and its parameters. + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the method name of the caller making the logging + request. + + + The method name of the caller making the logging + request. + + + + Gets the method name of the caller making the logging + request. + + + + + + Gets the method parameters of the caller making + the logging request. + + + The method parameters of the caller making + the logging request + + + + Gets the method parameters of the caller making + the logging request. + + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + returns a stack frame item from a stack frame. This + + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + An evaluator that triggers after specified number of seconds. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + Create a new evaluator using the time threshold in seconds. + + + + Create a new evaluator using the time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Create a new evaluator using the specified time threshold in seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + Create a new evaluator using the specified time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the specified time period + has passed since last check.. + Otherwise it returns false + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + The time threshold in seconds to trigger after + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + lookup the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings + + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Sub classes should override + rather than . + + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Default constructor. + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + The format info for the invariant culture. + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The format string. + + + Initializes a new instance of the class + with the specified format string. + + + The format string must be compatible with the options + that can be supplied to . + + + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + The format string used to format the . + + + + The format string must be compatible with the options + that can be supplied to . + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Points to the next filter in the filter chain. + + + + See for more information. + + + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Default constructor + + + + + Always returns the integer constant + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + flag to indicate if the filter should on a match + + + + + the to match against + + + + + Default constructor + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when matching a + + + + + the minimum value to match + + + + + the maximum value to match + + + + + Default constructor + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + Flag to indicate the behavior when we have a match + + + + + The logger name string to substring match against the event + + + + + Default constructor + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + Simple filter to match a string in the rendered message + + + + Simple filter to match a string in the rendered message + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when we have a match + + + + + The string to substring match against the message + + + + + A string regex to match + + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Default constructor + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + The key to use to lookup the string from the event properties + + + + + Default constructor + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the MDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a sub class). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + The option string to the converter + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + Get the next pattern converter in the chain + + + the next pattern converter in the chain + + + + Get the next pattern converter in the chain + + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + + + + + + Initializes a new instance of the class. + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Flag indicating if this converter handles exceptions + + + false if this converter handles exceptions + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Abstract class that provides access to the current HttpContext () that + derived classes need. + + + This class handles the case when HttpContext.Current is null by writing + to the writer. + + Ron Grabowski + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Cache will + be written to the output. + + + + + + Converter for items in the . + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net HttpContext item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Session will + be written to the output. + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert the pattern into the rendered message + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception or the exception property specified + by the Option value does not exist then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Recognized values for the Option parameter are: + + + + Message + + + Source + + + StackTrace + + + TargetSite + + + HelpLink + + + + + + + Writes the caller location file name to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location file name to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Get the fully qualified string data + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + Return the fully qualified '.' (dot/period) separated string. + + + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + The fully qualified type of the NamedPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + Adam Davies + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + Michael Cromwell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the strack frames to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Returns the Name of the method + + + This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter + string + + + + The fully qualified type of the StackTracePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Write the TimeStamp to the output + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the TimeStamp to the output + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + A flexible layout configurable with pattern string that re-evaluates on each call. + + + This class is built on and provides all the + features and capabilities of PatternLayout. PatternLayout is a 'static' class + in that its layout is done once at configuration time. This class will recreate + the layout on each reference. + One important difference between PatternLayout and DynamicPatternLayout is the + treatment of the Header and Footer parameters in the configuration. The Header and Footer + parameters for DynamicPatternLayout must be syntactically in the form of a PatternString, + but should not be marked as type log4net.Util.PatternString. Doing so causes the + pattern to be statically converted at configuration time and causes DynamicPatternLayout + to perform the same as PatternLayout. + Please see for complete documentation. + + <layout type="log4net.Layout.DynamicPatternLayout"> + <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + </layout> + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + aspnet-cache + + + Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-context + + + Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-request + + + Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-session + + + Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + stacktrace + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktrace{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + This pattern is not available for Compact Framework assemblies. + + + + + stacktracedetail + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktracedetail{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + This pattern is not available for Compact Framework assemblies. + + + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Format modifierleft justifyminimum widthmaximum widthcomment
%20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
%-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
%.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
%20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
%-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
+
+ + Note about caller location information.
+ The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
+ + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
+ + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
+ + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + The header text + + + + See for more information. + + + + + + The footer text + + + + See for more information. + + + + + + Flag indicating if this layout handles exceptions + + + + false if this layout handles exceptions + + + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + Convenience method for easily formatting the logging event into a string variable. + + + + Creates a new StringWriter instance to store the formatted logging event. + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override a this default setting. The default + value is true, this layout does not handle the exception. + + + + + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the m_converterRegistry instance map + + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Initialize the global registry + + + + Defines the builtin global rules. + + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + the event being logged + The TextWriter to write the formatted event to + + + Parse the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternLayout + + the name of the conversion pattern for this converter + the type of the converter + + + Add a named pattern converter to this instance. This + converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + The header PatternString + + + + + The footer PatternString + + + + + Constructs a DynamicPatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + + + + Constructs a DynamicPatternLayout using the supplied conversion pattern + + the pattern to use + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + The pattern will be formatted on each get operation. + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + The pattern will be formatted on each get operation. + + + + + A Layout that renders only the Exception text from the logging event + + + + A Layout that renders only the Exception text from the logging event. + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Constructs a ExceptionLayout + + + + + + Activate component options + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Format the logging event as an object. + + The event to format + returns the formatted event + + + Format the logging event as an object. + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + Type converter for the interface + + + + Used to convert objects to the interface. + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Convert the value to a object + + the value to convert + the object + + + Convert the object to a + object. If the object + is a then the + is used to adapt between the two interfaces, otherwise an + exception is thrown. + + + + + + Extract the value of a property from the + + + + Extract the value of a property from the + + + Nicko Cadell + + + + Constructs a RawPropertyLayout + + + + + Lookup the property for + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + The name of the value to lookup in the LoggingEvent Properties collection. + + + Value to lookup in the LoggingEvent Properties collection + + + + String name of the property to lookup in the . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawUtcTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the even, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format + the as XML. + + + + + + Flag to indicate if location information should be included in + the XML events. + + + + + The string to replace invalid chars with + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + The prefix to use for all generated element names + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether or not to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether or not to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Default constructor + + + + Default constructor + + + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Render the DictionaryEntry argument into a string + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Map class objects to an . + + + + Maintains a mapping between types that require special + rendering and the that + is used to render them. + + + The method is used to render an + object using the appropriate renderers defined in this map. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Default constructor. + + + + + + Render using the appropriate renderer. + + the object to render to a string + the object rendered as a string + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type + + the object to lookup the renderer for + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to lookup the renderer for + the renderer for the specified type + + + Returns the renderer for the specified type. + If no specific renderer has been defined the + will be returned. + + + + + + Internal function to recursively search interfaces + + the type to lookup the renderer for + the renderer for the specified type + + + + Clear the map of renderers + + + + Clear the custom renderers defined by using + . The + cannot be removed. + + + + + + Register an for . + + the type that will be rendered by + the renderer for + + + Register an object renderer for a specific source type. + This renderer will be returned from a call to + specifying the same as an argument. + + + + + + Get the default renderer instance + + the default renderer + + + Get the default renderer + + + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Allow subclasses to avoid our default constructors + + + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + Gets an object that can be used to synchronize access to the collection. + + + An object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + The current element in the collection. + + + + + + + + Map of repository plugins. + + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The repository that the plugins should be attached to. + + + Initialize a new instance of the class with a + repository that the plugins should be attached to. + + + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes a from the map. + + The to remove from the map. + + + Remove a specific plugin from this map. + + + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + Lookup a plugin by name. If the plugin is not found null + will be returned. + + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + Get a collection of all the plugins defined in this map. + + + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The name of this plugin. + + + + + The repository this plugin is attached to. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change one the + plugin has been attached to a repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + Plugin that listens for events from the + + + + This plugin publishes an instance of + on a specified . This listens for logging events delivered from + a remote . + + + When an event is received it is relogged within the attached repository + as if it had been raised locally. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + The property must be set. + + + + + + Construct with sink Uri. + + The name to publish the sink under in the remoting infrastructure. + See for more details. + + + Initializes a new instance of the class + with specified name. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + When the plugin is shutdown the remote logging + sink is disconnected. + + + + + + The fully qualified type of the RemoteLoggingServerPlugin class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the URI of this sink. + + + The URI of this sink. + + + + This is the name under which the object is marshaled. + + + + + + + Delivers objects to a remote sink. + + + + Internal class used to listen for logging events + and deliver them to the local repository. + + + + + + Constructor + + The repository to log to. + + + Initializes a new instance of the for the + specified . + + + + + + Logs the events to the repository. + + The events to log. + + + The events passed are logged to the + + + + + + Obtains a lifetime service object to control the lifetime + policy for this instance. + + null to indicate that this instance should live forever. + + + Obtains a lifetime service object to control the lifetime + policy for this instance. This object should live forever + therefore this implementation returns null. + + + + + + The underlying that events should + be logged to. + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Implementation of used by + + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + This constructor created a new instance and + sets its name. + + The name of the . + + + This constructor is protected and designed to be used by + a subclass that is not abstract. + + + Loggers are constructed by + objects. See for the default + logger creator. + + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + Add to the list of appenders of this + Logger instance. + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Look for the appender named as name + + The name of the appender to lookup + The appender with the name specified, or null. + + + Returns the named appender, or null if the appender is not found. + + + + + + Remove all previously added appenders from this Logger instance. + + + + Remove all previously added appenders from this Logger instance. + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + Remove the appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + Remove the named appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the and . + + + This method must not throw any exception to the caller. + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + This method must not throw any exception to the caller. + + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at + this. If no appenders could be found, emit a + warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + The fully qualified type of the Logger class. + + + + + The name of this logger. + + + + + The assigned level of this logger. + + + + The level variable need not be + assigned a value in which case it is inherited + form the hierarchy. + + + + + + The parent of this logger. + + + + The parent of this logger. + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + Loggers need to know what Hierarchy they are in. + The hierarchy that this logger is a member of is stored + here. + + + + + + Helper implementation of the interface + + + + + Flag indicating if child loggers inherit their parents appenders + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + true if child loggers inherit their parent's appenders. + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this + Logger instance is attached to. + + The hierarchy that this logger belongs to. + + + This logger must be attached to a single . + + + + + + Gets or sets the assigned , if any, for this Logger. + + + The of this logger. + + + + The assigned can be null. + + + + + + Get the appenders contained in this logger as an + . + + A collection of the appenders in this logger + + + Get the appenders contained in this logger as an + . If no appenders + can be found, then a is returned. + + + + + + Gets the logger name. + + + The name of the logger. + + + + The name of this logger + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Construct a new Logger + + the name of the logger + + + Initializes a new instance of the class + with the specified name. + + + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + Delegate used to handle logger creation event notifications. + + + + + + Provides data for the event. + + + + A event is raised every time a + is created. + + + + + + The created + + + + + Constructor + + The that has been created. + + + Initializes a new instance of the event argument + class,with the specified . + + + + + + Gets the that has been created. + + + The that has been created. + + + + The that has been created. + + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class + directly. + + + This class is specialized in retrieving loggers by name and + also maintaining the logger hierarchy. Implements the + interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, + then it creates a provision node for the ancestor and adds itself + to the provision node. Other descendants of the same ancestor add + themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Interface implemented by logger repositories. + + + + This interface is implemented by logger repositories. e.g. + . + + + This interface is used by the + to obtain interfaces. + + + Nicko Cadell + Gert Driesen + + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + The name of the logger to lookup + The Logger object with the name specified + + + If the names logger exists it is returned, otherwise + null is returned. + + + + + + Returns all the currently defined loggers as an Array. + + All the defined loggers + + + Returns all the currently defined loggers as an Array. + + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + Shutdown the repository + + + Shutting down a repository will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The name of the repository + + + The name of the repository + + + + The name of the repository. + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Collection of internal messages captured during the most + recent configuration process. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + + These properties can be specified on a repository specific basis. + + + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The fully qualified type of the LoggerRepositorySkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + Notify any listeners that this repository's configuration has changed. + + + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Contains a list of internal messages captures during the + last configuration. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Initialize the repository using the specified appenders + + the appenders to use to log all logging events + + + Configure the repository to route all logging events to the + specified appenders. + + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Construct with properties + + The properties to pass to this repository. + + + Initializes a new instance of the class. + + + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Construct with properties and a logger factory + + The properties to pass to this repository. + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The Shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + + + Collect the appenders from an container + + + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + true if the repository is disabled for the level argument, false otherwise. + + + + If this hierarchy has not been configured then this method will + always return true. + + + This method will return true if this repository is + disabled for level object passed as parameter and + false otherwise. + + + See also the property. + + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before + invoking this method. + + + + + + Return a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + he loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this + potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + + Define or redefine a Level using the values in the argument + + + Supports setting levels via the configuration file. + + + + + + Set a Property using the values in the argument + + the property value + + + Set a Property using the values in the argument. + + + Supports setting property values via the configuration file. + + + + + + The fully qualified type of the Hierarchy class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Event used to notify that a logger has been created. + + + + Event raised when a logger is created. + + + + + + Has no appender warning been emitted + + + + Flag to indicate if we have already issued a warning + about not having an appender warning. + + + + + + Get the root of this hierarchy + + + + Get the root of this hierarchy. + + + + + + Gets or sets the default instance. + + The default + + + The logger factory is used to create logger instances. + + + + + + A class to hold the value, name and display name for a level + + + + A class to hold the value, name and display name for a level + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Value of the level + + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + + Name of the level + + + The name of the level + + + + The name of the level. + + + + + + Display name for the level + + + The display name of the level + + + + The display name of the level. + + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Determines whether two instances + are equal. + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + Compares the references of the interned strings. + + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of + a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + Initializes a new instance of the class + with the specified child logger. + + + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + Initializes the log4net environment using an XML DOM. + + + + Configures a using an XML DOM. + + + Nicko Cadell + Gert Driesen + + + + Construct the configurator for a hierarchy + + The hierarchy to build. + + + Initializes a new instance of the class + with the specified . + + + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The Hierarchy being configured. + + + + + The fully qualified type of the XmlHierarchyConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + + + + + + + + + + + + + + + + Delegate used to handle logger repository shutdown event notifications + + The that is shutting down. + Empty event args + + + Delegate used to handle logger repository shutdown event notifications. + + + + + + Delegate used to handle logger repository configuration reset event notifications + + The that has had its configuration reset. + Empty event args + + + Delegate used to handle logger repository configuration reset event notifications. + + + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + Delegate used to handle event notifications for logger repository configuration changes. + + + + + + Write the name of the current AppDomain to the output + + + + Write the name of the current AppDomain to the output writer + + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an folder path to the output + + + + Write an special path environment folder path to the output writer. + The value of the determines + the name of the variable to output. + should be a value in the enumeration. + + + Ron Grabowski + + + + Write an special path environment folder path to the output + + the writer to write to + null, state is not set + + + Writes the special path environment folder path to the output . + The name of the special path environment folder path to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentFolderPathPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + The fully qualified type of the IdentityPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + The fully qualified type of the ProcessIdPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters + and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write a randoim string to the output + + the writer to write to + null, state is not set + + + Write a randoim string to the output . + + + + + + The fully qualified type of the RandomStringPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + The fully qualified type of the UserNamePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between + types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + Initializes a new instance of the class. + + + + + Static constructor. + + + + This constructor defines the intrinsic type converters. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + Adds a converter instance for a specific type. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + Adds a converter for a specific type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + The fully qualified type of the ConverterRegistry class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Mapping from to type converter. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + The string type name of the type converter + + + + + Default constructor + + + + Default constructor + + + + + + Create a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Create a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the m_appenderList + + + + + The fully qualified type of the AppenderAttachedImpl class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Base class for Context Properties implementations + + + + This class defines a basic property get set accessor + + + Nicko Cadell + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration by custom + PatternString and PatternLayer converters. + + + + + + default constructor + + + + + + + + + + + Gets or sets the name of the conversion pattern + + + + The name of the pattern in the format string + + + + + + Gets or sets the type of the converter + + + + The value specified must extend the + type. + + + + + + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Adapter that extends and forwards all + messages to an instance of . + + + + Adapter that extends and forwards all + messages to an instance of . + + + Nicko Cadell + + + + The writer to forward messages to + + + + + Create an instance of that forwards all + messages to a . + + The to forward to + + + Create an instance of that forwards all + messages to a . + + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Gets or sets the underlying . + + + The underlying . + + + + Gets or sets the underlying . + + + + + + The Encoding in which the output is written + + + The + + + + The Encoding in which the output is written + + + + + + Gets an object that controls formatting + + + The format provider + + + + Gets an object that controls formatting + + + + + + Gets or sets the line terminator string used by the TextWriter + + + The line terminator to use + + + + Gets or sets the line terminator string used by the TextWriter + + + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + Writes a string to the output. + + + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Flag to indicate if this writer is closed + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Total number of bytes written. + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the event dropped is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + The th oldest event currently in the buffer. + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + The singleton instance of the empty collection. + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + The singleton instance of the empty dictionary. + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + The minimum value. + + + + Gets or sets the minimum value. + + + + + + Gets or sets the maximum value. + + + The maximum value. + + + + Gets or sets the maximum value. + + + + + + Gets or sets a flag indicating whether left align is enabled + or not. + + + A flag indicating whether left align is enabled or not. + + + + Gets or sets a flag indicating whether left align is enabled or not. + + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + Manages a mapping from levels to + + + + Manages an ordered mapping from instances + to subclasses. + + + Nicko Cadell + + + + Default constructor + + + + Initialise a new instance of . + + + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Lookup the mapping for the specified level + + the level to lookup + the for the level or null if no mapping found + + + Lookup the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + + If no mapping could be found then null is returned. + + + + + + Initialize options + + + + Caches the sorted list of in an array + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + This class stores its properties in a slot on the named + log4net.Util.LogicalThreadContextProperties. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Nicko Cadell + + + + Flag used to disable this context if we don't have permission to access the CallContext. + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if is does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets the call context get data. + + The peroperties dictionary stored in the call context + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + Sets the call context data. + + The properties. + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + The fully qualified type of the LogicalThreadContextProperties class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Get or set the property value for the specified. + + + + + + + + + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + Formats Prefix, Source, and Message in the same format as the value + sent to Console.Out and Trace.Write. + + + + + + Initializes a new instance of the class. + + + + + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Writes log4net internal debug messages to the + standard output stream. + + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Default debug level + + + + + In quietMode not even errors generate any output. + + + + + The event raised when an internal message has been received. + + + + + The Type that generated the internal message. + + + + + The DateTime stamp of when the internal message was received. + + + + + A string indicating the severity of the internal message. + + + "log4net: ", + "log4net:ERROR ", + "log4net:WARN " + + + + + The internal log message. + + + + + The Exception related to the message. + + + Optional. Will be null if no Exception was passed. + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + Test if LogLog.Warn is enabled for output. + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Subscribes to the LogLog.LogReceived event and stores messages + to the supplied IList instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a native error code and message. + + + + Represents a Win32 platform native error. + + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + Create an instance of the class with the specified + error number and message. + + + + + + Create a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + The message of the native error. + + + + + Gets the message of the native error. + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is processed using the LogLog sub-system by default. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Reset the error handler back to its initial disabled state. + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log the very first error + + The error message. + The exception. + The internal error code. + + + Sends the error information to 's Error method. + + + + + + Log an Error + + The error message. + The exception. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log an error + + The error message. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + The date the error was recorded. + + + + + Flag to indicate if it is the first error + + + + + The message recorded during the first error. + + + + + The exception recorded during the first error. + + + + + The error code recorded during the first error. + + + + + String to prefix each message with + + + + + The fully qualified type of the OnlyOnceErrorHandler class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Is error logging enabled + + + + Is error logging enabled. Logging is only enabled for the + first error delivered to the . + + + + + + The date the first error that trigged this error handler occured. + + + + + The message from the first error that trigged this error handler. + + + + + The exception from the first error that trigged this error handler. + + + May be . + + + + + The error code from the first error that trigged this error handler. + + + Defaults to + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + The fully qualified type of the OptionConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + Parses the pattern into a chain of pattern converters. + + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + Build the unified cache of converters from the static and instance maps + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + Internal map of converter identifiers to converter types + + + + This map overrides the static s_globalRulesRegistry map. + + + + + + The fully qualified type of the PatternParser class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Get the converter registry used by this parser + + + The converter registry used by this parser + + + + Get the converter registry used by this parser + + + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + date + + + Used to output the current date and time in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Initialize the global registry + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Add a converter to this PatternString + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + Add a converter to this PatternString + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + String keyed object map. + + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + The Hashtable used to store the properties data + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + + See + + + + + + + Remove all properties from the properties collection + + + + + See + + + + + + + See + + + + + + + See + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + The number of properties in this collection + + + + + See + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + the key to lookup in the collection + true if the collection contains the specified key + + + Test if this collection contains a specified key. + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + + + See + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + A class to hold the key and data for a property set in the config file + + + + A class to hold the key and data for a property set in the config file + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Property Key + + + Property Key + + + + Property Key. + + + + + + Property Value + + + Property Value + + + + Property Value. + + + + + + A that ignores the message + + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + + Create a new ProtectCloseTextWriter using a writer + + + + + + Attach this instance to a different underlying + + the writer to attach to + + + Attach this instance to a different underlying + + + + + + Does not close the underlying output writer. + + + + Does not close the underlying output writer. + This method does nothing. + + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + A that can be and reused + + + + A that can be and reused. + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Create an instance of + + the format provider to use + + + Create an instance of + + + + + + Override Dispose to prevent closing of writer + + flag + + + Override Dispose to prevent closing of writer + + + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + + + Utility class of static methods for system specific information. + + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Private constructor to prevent instances. + + + + Only static methods are exposed from this type. + + + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the fully qualified name of the , including + the name of the assembly from which the was + loaded. + + The to get the fully qualified name for. + The fully qualified name for the . + + + This is equivalent to the Type.AssemblyQualifiedName property, + but this method works on the .NET Compact Framework 1.0 as well as + the full .NET runtime. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Use this rather than Assembly.GetName().Name because that + is not available on the Compact Framework. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the + assembly that is directly calling this method. If the type is not found + in the assembly then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Generate a new guid + + A new Guid + + + Generate a new guid + + + + + + Create an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + the ArgumentOutOfRangeException object + + + Create a new instance of the class + with a specified error message, the parameter name, and the value + of the argument. + + + The Compact Framework does not support the 3 parameter constructor for the + type. This method provides an + implementation that works for all platforms. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + Configuration APIs are not supported under the Compact Framework + + + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Gets an empty array of types. + + + + The Type.EmptyTypes field is not available on + the .NET Compact Framework 1.0. + + + + + + The fully qualified type of the SystemInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Text to output when a null is encountered. + + + + + Text to output when an unsupported feature is requested. + + + + + Start time for the current process. + + + + + Gets the system dependent line terminator. + + + The system dependent line terminator. + + + + Gets the system dependent line terminator. + + + + + + Gets the base directory for this . + + The base directory path for the current . + + + Gets the base directory for this . + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + The path to the configuration file for the current . + + + The .NET Compact Framework 1.0 does not have a concept of a configuration + file. For this runtime, we use the entry assembly location as the root for + the configuration file name. + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + The path to the entry assembly. + + + Gets the path to the file that first executed in the current . + + + + + + Gets the ID of the current thread. + + The ID of the current thread. + + + On the .NET framework, the AppDomain.GetCurrentThreadId method + is used to obtain the thread ID for the current thread. This is the + operating system ID for the thread. + + + On the .NET Compact Framework 1.0 it is not possible to get the + operating system thread ID for the current thread. The native method + GetCurrentThreadId is implemented inline in a header file + and cannot be called. + + + On the .NET Framework 2.0 the Thread.ManagedThreadId is used as this + gives a stable id unrelated to the operating system thread ID which may + change if the runtime is using fibers. + + + + + + Get the host name or machine name for the current machine + + + The hostname or machine name + + + + Get the host name or machine name for the current machine + + + The host name () or + the machine name (Environment.MachineName) for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Get this application's friendly name + + + The friendly name of this application as a string + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the start time for the current process. + + + + This is the time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Utility class that represents a format string. + + + + Utility class that represents a format string. + + + Nicko Cadell + + + + Initialise the + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + The fully qualified type of the SystemStringFormat class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + Each thread will automatically have its instance. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Get the keys stored in the properties. + + + Gets the keys stored in the properties. + + a set of the defined keys + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Characters illegal in XML 1.0 + + + + + Impersonate a Windows Account + + + + This impersonates a Windows account. + + + How the impersonation is done depends on the value of . + This allows the context to either impersonate a set of user credentials specified + using username, domain name and password or to revert to the process credentials. + + + + + + Default constructor + + + + Default constructor + + + + + + Initialize the SecurityContext based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The security context will try to Logon the specified user account and + capture a primary token for impersonation. + + + The required , + or properties were not specified. + + + + Impersonate the Windows account specified by the and properties. + + caller provided state + + An instance that will revoke the impersonation of this SecurityContext + + + + Depending on the property either + impersonate a user using credentials supplied or revert + to the process credentials. + + + + + + Create a given the userName, domainName and password. + + the user name + the domain name + the password + the for the account specified + + + Uses the Windows API call LogonUser to get a principal token for the account. This + token is used to initialize the WindowsIdentity. + + + + + + Gets or sets the impersonation mode for this security context + + + The impersonation mode for this security context + + + + Impersonate either a user with user credentials or + revert this thread to the credentials of the process. + The value is one of the + enum. + + + The default value is + + + When the mode is set to + the user's credentials are established using the + , and + values. + + + When the mode is set to + no other properties need to be set. If the calling thread is + impersonating then it will be reverted back to the process credentials. + + + + + + Gets or sets the Windows username for this security context + + + The Windows username for this security context + + + + This property must be set if + is set to (the default setting). + + + + + + Gets or sets the Windows domain name for this security context + + + The Windows domain name for this security context + + + + The default value for is the local machine name + taken from the property. + + + This property must be set if + is set to (the default setting). + + + + + + Sets the password for the Windows account specified by the and properties. + + + The password for the Windows account specified by the and properties. + + + + This property must be set if + is set to (the default setting). + + + + + + The impersonation modes for the + + + + See the property for + details. + + + + + + Impersonate a user using the credentials supplied + + + + + Revert this the thread to the credentials of the process + + + + + Adds to + + + + Helper class to expose the + through the interface. + + + + + + Constructor + + the impersonation context being wrapped + + + Constructor + + + + + + Revert the impersonation + + + + Revert the impersonation + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + Private Constructor. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + The global context properties instance + + + + + The global properties map. + + + The global properties map. + + + + The global properties map. + + + + + + Provides information about the environment the assembly has + been built for. + + + + Version of the assembly + + + Version of the framework targeted + + + Type of framework targeted + + + Does it target a client profile? + + + + Identifies the version and target for this assembly. + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + The thread properties map + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The logical thread stacks. + + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + Returns the named logger if it exists. + + Returns the named logger if it exists. + + + + If the named logger exists (in the default repository) then it + returns a reference to the logger, otherwise it returns null. + + + The fully qualified logger name to look for. + The logger found, or null if no logger could be found. + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + Get the currently defined loggers. + + Returns all the currently defined loggers in the default repository. + + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + Get or create a logger. + + Retrieves or creates a named logger. + + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to lookup the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + Shutdown a logger repository. + + Shuts down the default repository. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + default repository. + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shutdown. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to lookup the repository. + + + Reset the configuration of a repository + + Resets all values contained in this repository instance to their defaults. + + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to lookup the repository to reset. + + + Get the logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Get a logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Create a domain + + Creates a repository with the specified repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + Create a logger repository. + + Creates a repository with the specified repository type. + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + + + + Creates a repository with the specified name. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using(NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + diff --git a/packages/log4net.2.0.3/lib/net11-full/log4net.dll b/packages/log4net.2.0.3/lib/net11-full/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..33d7945e76c7fb0434e429cfa0e1894f87f40b39 GIT binary patch literal 299008 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 + + + log4net + + + + + Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Closes the appender and release resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + + If there is no threshold set, then the return value is always true. + + + + true if the meets the + requirements of this appender. + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A sub class that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + The layout of this appender. + + + See for more information. + + + + + The name of this appender. + + + See for more information. + + + + + The level threshold of this appender. + + + + There is no level threshold filtering by default. + + + See for more information. + + + + + + It is assumed and enforced that errorHandler is never null. + + + + It is assumed and enforced that errorHandler is never null. + + + See for more information. + + + + + + The first filter in the filter chain. + + + + Set to null initially. + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + StringWriter used to render events + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the threshold of this appender. + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + + The name uniquely identifies the appender. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns false. + + + + true if the appender requires a layout object, otherwise false. + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be send. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be send. + + + The subclass must override this method to process the buffered events. + + + + + + The size of the cyclic buffer used to hold the logging events. + + + Set to by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The triggering event evaluator that causes the buffer to be sent immediately. + + + The object that is used to determine if an event causes the entire + buffer to be sent immediately. This field can be null, which + indicates that event triggering is not to be done. The evaluator + can be set using the property. If this appender + has the ( property) set to + true then an must be set. + + + + + Indicates if the appender should overwrite events in the cyclic buffer + when it becomes full, or if the buffer should be flushed when the + buffer is full. + + + If this field is set to true then an must + be set. + + + + + The triggering event evaluator filters discarded events. + + + The object that is used to determine if an event that is discarded should + really be discarded or if it should be sent to the appenders. + This field can be null, which indicates that all discarded events will + be discarded. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + The events delivered to the subclass must be fixed. + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be send to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets a value indicating if only part of the logging event data + should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the + event data to be fixed and serialized. This will improve performance. + + + See for more information. + + + + + + Gets or sets a the fields that will be fixed in the event + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Creates an instance used to connect to the database. + + + This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). + + The of the object. + The connectionString output from the ResolveConnectionString method. + An instance with a valid connection string. + + + + Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey + property. + + + ConnectiongStringName is only supported on .NET 2.0 and higher. + + Additional information describing the connection string. + A connection string used to connect to the database. + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Prepares the database command and initialize the parameters. + + + + + Connects to the database. + + + + + Cleanup the existing command. + + + If true, a message will be written using LogLog.Warn if an exception is encountered when calling Dispose. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + Flag to indicate if we are using a command object + + + + Set to true when the appender is to use a prepared + statement or stored procedure to insert into the database. + + + + + + The list of objects. + + + + The list of objects. + + + + + + The security context to use for privileged calls + + + + + The that will be used + to insert logging events into a database. + + + + + The database command. + + + + + Database connection string. + + + + + The appSettings key from App.Config that contains the connection string. + + + + + String type name of the type name. + + + + + The text of the command. + + + + + The command type. + + + + + Indicates whether to use transactions when writing to the database. + + + + + Indicates whether to use transactions when writing to the database. + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + The appSettings key from App.Config that contains the connection string. + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The name of this parameter. + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + The precision for this parameter. + + + + + The scale for this parameter. + + + + + The size for this parameter. + + + + + The to use to render the + logging event into an object for this parameter. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined together to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined together not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Ansi code to reset terminal + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Add a mapping of level to color + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colours + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Target is the value of the console output stream. + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The enum of possible display attributes + + + + The following flags can be combined together to + form the ANSI color attributes. + + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + text color is light + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + The output can be in one for the following ANSI colors. + + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + An entry in the + + + + This is an abstract base class for types that are stored in the + object. + + + Nicko Cadell + + + + Default protected constructor + + + + Default protected constructor + + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialise based on their options + + + + + + The level that is the key for this mapping + + + The that is the key for this mapping + + + + Get or set the that is the key for this + mapping subclass. + + + + + + Initialize the options for the object + + + + Combine the and together + and append the attributes. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level + + + + + + The color attributes for the specified level + + + + Required property. + The color attributes for the specified level + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Creates a read-only wrapper for a AppenderCollection instance. + + list to create a readonly wrapper arround + + An AppenderCollection wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the AppenderCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the AppenderCollection class + that has the specified initial capacity. + + + The number of elements that the new AppenderCollection is initially capable of storing. + + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified AppenderCollection. + + The AppenderCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Allow subclasses to avoid our default constructors + + + + + + + Copies the entire AppenderCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire AppenderCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Adds a to the end of the AppenderCollection. + + The to be added to the end of the AppenderCollection. + The index at which the value has been added. + + + + Removes all elements from the AppenderCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the AppenderCollection. + + The to check for. + true if is found in the AppenderCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the AppenderCollection. + + The to locate in the AppenderCollection. + + The zero-based index of the first occurrence of + in the entire AppenderCollection, if found; otherwise, -1. + + + + + Inserts an element into the AppenderCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the AppenderCollection. + + The to remove from the AppenderCollection. + + The specified was not found in the AppenderCollection. + + + + + Removes the element at the specified index of the AppenderCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Returns an enumerator that can iterate through the AppenderCollection. + + An for the entire AppenderCollection. + + + + Adds the elements of another AppenderCollection to the current AppenderCollection. + + The AppenderCollection whose elements should be added to the end of the current AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a array to the current AppenderCollection. + + The array whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a collection to the current AppenderCollection. + + The collection whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Gets the number of elements actually contained in the AppenderCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Gets or sets the number of elements the AppenderCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + + + + + Appends log events to the ASP.NET system. + + + + + Diagnostic information and tracing messages that you specify are appended to the output + of the page that is sent to the requesting browser. Optionally, you can view this information + from a separate trace viewer (Trace.axd) that displays trace information for every page in a + given application. + + + Trace statements are processed and displayed only when tracing is enabled. You can control + whether tracing is displayed to a page, to the trace viewer, or both. + + + The logging event is passed to the or + method depending on the level of the logging event. + The event's logger name is the default value for the category parameter of the Write/Warn method. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the ASP.NET trace + + the event to log + + + Write the logging event to the ASP.NET trace + HttpContext.Current.Trace + (). + + + + + + Defaults to %logger + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be send. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this buffering appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Appends logging events to the console. + + + + ColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes directly to the application's attached console + not to the System.Console.Out or System.Console.Error TextWriter. + The System.Console.Out and System.Console.Error streams can be + programmatically redirected (for example NUnit does this to capture program output). + This appender will ignore these redirections because it needs to use Win32 + API calls to colorize the output. To respect these redirections the + must be used. + + + When configuring the colored console appender, mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + combination of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + HighIntensity + + + + Rick Hobbs + Nicko Cadell + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + The console output stream writer to write to + + + + This writer is not thread safe. + + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The enum of possible color values for use with the color mapping method + + + + The following flags can be combined together to + form the colors. + + + + + + + color is blue + + + + + color is green + + + + + color is red + + + + + color is white + + + + + color is yellow + + + + + color is purple + + + + + color is cyan + + + + + color is intensified + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + The combined and suitable for + setting the console color. + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + If is true then the + is called. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Writes events to the system event log. + + + + The appender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges. + See also http://logging.apache.org/log4net/release/faq.html#trouble-EventLog + + + The EventID of the event log entry can be + set using the EventID property () + on the . + + + The Category of the event log entry can be + set using the Category property () + on the . + + + There is a limit of 32K characters for an event log message + + + When configuring the EventLogAppender a mapping can be + specified to map a logging level to an event log entry type. For example: + + + <mapping> + <level value="ERROR" /> + <eventLogEntryType value="Error" /> + </mapping> + <mapping> + <level value="DEBUG" /> + <eventLogEntryType value="Information" /> + </mapping> + + + The Level is the standard log4net logging level and eventLogEntryType can be any value + from the enum, i.e.: + + Erroran error event + Warninga warning event + Informationan informational event + + + + Aspi Havewala + Douglas de la Torre + Nicko Cadell + Gert Driesen + Thomas Voss + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class + with the specified . + + The to use with this appender. + + + Obsolete constructor. + + + + + + Add a mapping of level to - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the event log entry type for a level. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create an event log source + + + Uses different API calls under NET_2_0 + + + + + This method is called by the + method. + + the event to log + + Writes the event to the system event log using the + . + + If the event has an EventID property (see ) + set then this integer will be used as the event log event id. + + + There is a limit of 32K characters for an event log message + + + + + + Get the equivalent for a + + the Level to convert to an EventLogEntryType + The equivalent for a + + Because there are fewer applicable + values to use in logging levels than there are in the + this is a one way mapping. There is + a loss of information during the conversion. + + + + + The log name is the section in the event logs where the messages + are stored. + + + + + Name of the application to use when logging. This appears in the + application column of the event log named by . + + + + + The name of the machine which holds the event log. This is + currently only allowed to be '.' i.e. the current machine. + + + + + Mapping from level object to EventLogEntryType + + + + + The security context to use for privileged calls + + + + + The event ID to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + The event category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + The fully qualified type of the EventLogAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The maximum size supported by default. + + + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx + The 32766 documented max size is two bytes shy of 32K (I'm assuming 32766 + may leave space for a two byte null terminator of #0#0). The 32766 max + length is what the .NET 4.0 source code checks for, but this is WRONG! + Strings with a length > 31839 on Windows Vista or higher can CORRUPT + the event log! See: System.Diagnostics.EventLogInternal.InternalWriteEvent() + for the use of the 32766 max size. + + + + + The maximum size supported by a windows operating system that is vista + or newer. + + + See ReportEvent API: + http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx + ReportEvent's lpStrings parameter: + "A pointer to a buffer containing an array of + null-terminated strings that are merged into the message before Event Viewer + displays the string to the user. This parameter must be a valid pointer + (or NULL), even if wNumStrings is zero. Each string is limited to 31,839 characters." + + Going beyond the size of 31839 will (at some point) corrupt the event log on Windows + Vista or higher! It may succeed for a while...but you will eventually run into the + error: "System.ComponentModel.Win32Exception : A device attached to the system is + not functioning", and the event log will then be corrupt (I was able to corrupt + an event log using a length of 31877 on Windows 7). + + The max size for Windows Vista or higher is documented here: + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx. + Going over this size may succeed a few times but the buffer will overrun and + eventually corrupt the log (based on testing). + + The maxEventMsgSize size is based on the max buffer size of the lpStrings parameter of the ReportEvent API. + The documented max size for EventLog.WriteEntry for Windows Vista and higher is 31839, but I'm leaving room for a + terminator of #0#0, as we cannot see the source of ReportEvent (though we could use an API monitor to examine the + buffer, given enough time). + + + + + The maximum size that the operating system supports for + a event log message. + + + Used to determine the maximum string length that can be written + to the operating system event log and eventually truncate a string + that exceeds the limits. + + + + + This method determines the maximum event log message size allowed for + the current environment. + + + + + + The name of the log where messages will be stored. + + + The string name of the log where messages will be stored. + + + This is the name of the log as it appears in the Event Viewer + tree. The default value is to log into the Application + log, this is where most applications write their events. However + if you need a separate log for your application (or applications) + then you should set the appropriately. + This should not be used to distinguish your event log messages + from those of other applications, the + property should be used to distinguish events. This property should be + used to group together events into a single log. + + + + + + Property used to set the Application name. This appears in the + event logs when logging. + + + The string used to distinguish events from different sources. + + + Sets the event log source property. + + + + + This property is used to return the name of the computer to use + when accessing the event logs. Currently, this is the current + computer, denoted by a dot "." + + + The string name of the machine holding the event log that + will be logged into. + + + This property cannot be changed. It is currently set to '.' + i.e. the local machine. This may be changed in future. + + + + + Gets or sets the used to write to the EventLog. + + + The used to write to the EventLog. + + + + The system security context used to write to the EventLog. + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the EventId to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The EventID of the event log entry will normally be + set using the EventID property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Gets or sets the Category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The Category of the event log entry will normally be + set using the Category property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and its event log entry type. + + + + + + The for this entry + + + + Required property. + The for this entry + + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by + the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative models only hold a + write lock while the appender is writing a logging event () + or synchronize by using a named system wide Mutex (). + + + All locking strategies have issues and you should seriously consider using a different strategy that + avoids having multiple processes logging to the same file. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class and + sets the output destination to a new initialized + with the specified . + + The layout to use with this appender. + The to output to. + + + Obsolete constructor. + + + + + + Initializes a new instance of the class and sets + the output destination to the specified . + + The layout to use with this appender + The to output to + + The must have been previously opened. + + + + Obsolete constructor. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checks if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Writes the footer and closes the underlying . + + + + Writes the footer and closes the underlying . + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + This is the where logging events + will be written to. + + + + + Immediate flush means that the underlying + or output stream will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logging events are not actually persisted if and when the application + crashes. + + + The default value is true. + + + + + + The fully qualified type of the TextWriterAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + Default constructor + + + + Default constructor + + + + + + Construct a new appender using the layout, file and append mode. + + the layout to use with this appender + the full path to the file to write to + flag to indicate if the file should be appended to + + + Obsolete constructor. + + + + + + Construct a new appender using the layout and file specified. + The file will be appended to. + + the layout to use with this appender + the full path to the file to write to + + + Obsolete constructor. + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by sub classes that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by sub classes that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Flag to indicate if we should append to the file + or overwrite the file. The default is to append. + + + + + The name of the log file. + + + + + The encoding to use for the file stream. + + + + + The security context to use for privileged calls + + + + + The stream to log to. Has added locking semantics + + + + + The locking model to use + + + + + The fully qualified type of the FileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are three built in locking models, , and . + The first locks the file from the start of logging to the end, the + second locks only for the minimal amount of time when logging each message + and the last synchronizes processes using a named system wide Mutex. + + + The default locking model is the . + + + + + + Write only that uses the + to manage access to an underlying resource. + + + + + True asynchronous writes are not supported, the implementation forces a synchronous write. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Helper method that creates a FileStream under CurrentAppender's SecurityContext. + + + + Typically called during OpenFile or AcquireLock. + + + If the directory portion of the does not exist, it is created + via Directory.CreateDirecctory. + + + + + + + + + + Helper method to close under CurrentAppender's SecurityContext. + + + Does not set to null. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Provides cross-process file locking. + + Ron Grabowski + Steve Wranovsky + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + - and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a local syslog service. + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + The facility. The default facility is . + + + + + The message identity + + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + the current list of events that have been appended. + + + Use the method to clear the + current list of events. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets the events that have been logged. + + The events that have been logged + + + Gets the events that have been logged. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + The list of events that have been appended. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + Gets or sets a value indicating whether only part of the logging event + data should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the event + data to be fixed and stored in the appender, hereby improving performance. + + + See for more information. + + + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + Logs entries by sending network messages using the + native function. + + + + You can send messages only to names that are active + on the network. If you send the message to a user name, + that user must be logged on and running the Messenger + service to receive the message. + + + The receiver will get a top most window displaying the + messages one at a time, therefore this appender should + not be used to deliver a high volume of messages. + + + The following table lists some possible uses for this appender : + + + + + Action + Property Value(s) + + + Send a message to a user account on the local machine + + + = <name of the local machine> + + + = <user name> + + + + + Send a message to a user account on a remote machine + + + = <name of the remote machine> + + + = <user name> + + + + + Send a message to a domain user account + + + = <name of a domain controller | uninitialized> + + + = <user name> + + + + + Send a message to all the names in a workgroup or domain + + + = <workgroup name | domain name>* + + + + + Send a message from the local machine to a remote machine + + + = <name of the local machine | uninitialized> + + + = <name of the remote machine> + + + + + + + Note : security restrictions apply for sending + network messages, see + for more information. + + + + + An example configuration section to log information + using this appender from the local machine, named + LOCAL_PC, to machine OPERATOR_PC : + + + + + + + + + + Nicko Cadell + Gert Driesen + + + + The DNS or NetBIOS name of the server on which the function is to execute. + + + + + The sender of the network message. + + + + + The message alias to which the message should be sent. + + + + + The security context to use for privileged calls + + + + + Initializes the appender. + + + The default constructor initializes all fields to their default values. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified. + + + The required property was not specified. + + + + This method is called by the method. + + The event to log. + + + Sends the event using a network message. + + + + + + Sends a buffer of information to a registered message alias. + + The DNS or NetBIOS name of the server on which the function is to execute. + The message alias to which the message buffer should be sent + The originator of the message. + The message text. + The length, in bytes, of the message text. + + + The following restrictions apply for sending network messages: + + + + + Platform + Requirements + + + Windows NT + + + No special group membership is required to send a network message. + + + Admin, Accounts, Print, or Server Operator group membership is required to + successfully send a network message on a remote server. + + + + + Windows 2000 or later + + + If you send a message on a domain controller that is running Active Directory, + access is allowed or denied based on the access control list (ACL) for the securable + object. The default ACL permits only Domain Admins and Account Operators to send a network message. + + + On a member server or workstation, only Administrators and Server Operators can send a network message. + + + + + + + For more information see Security Requirements for the Network Management Functions. + + + + + If the function succeeds, the return value is zero. + + + + + + Gets or sets the sender of the message. + + + The sender of the message. + + + If this property is not specified, the message is sent from the local computer. + + + + + Gets or sets the message alias to which the message should be sent. + + + The recipient of the message. + + + This property should always be specified in order to send a message. + + + + + Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. + + + DNS or NetBIOS name of the remote server on which the function is to execute. + + + + For Windows NT 4.0 and earlier, the string should begin with \\. + + + If this property is not specified, the local computer is used. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Appends log events to the OutputDebugString system. + + + + OutputDebugStringAppender appends log events to the + OutputDebugString system. + + + The string is passed to the native OutputDebugString + function. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the output debug string API + + the event to log + + + Write the logging event to the output debug string API + + + + + + Stub for OutputDebugString native method + + the string to output + + + Stub for OutputDebugString native method + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The IP address of the remote host or multicast group to which + the logging event will be sent. + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The cached remote endpoint to which the logging events will be sent. + + + + + The TCP port number from which the will communicate. + + + + + The instance that will be used for sending the + logging events. + + + + + The encoding to use for the packet. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The cached remote endpoint to which the logging events will be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Syslog port 514 + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + The facility. The default facility is . + + + + + The message identity + + + + + Mapping from level object to syslog severity + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Delivers logging events to a remote logging sink. + + + + This Appender is designed to deliver events to a remote sink. + That is any object that implements the + interface. It delivers the events using .NET remoting. The + object to deliver events to is specified by setting the + appenders property. + + The RemotingAppender buffers events before sending them. This allows it to + make more efficient use of the remoting infrastructure. + + Once the buffer is full the events are still not sent immediately. + They are scheduled to be sent using a pool thread. The effect is that + the send occurs asynchronously. This is very important for a + number of non obvious reasons. The remoting infrastructure will + flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + Because the events are sent asynchronously using pool threads it is possible to close + this appender before all the queued events have been sent. + When closing the appender attempts to wait until all the queued events have been sent, but + this will timeout after 30 seconds regardless. + + If this appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. If the runtime terminates the threads before + the queued events have been sent then they will be lost. To ensure that all events + are sent the appender must be closed before the application exits. See + for details on how to shutdown + log4net programmatically. + + + Nicko Cadell + Gert Driesen + Daniel Cazzulino + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Send the contents of the buffer to the remote sink. + + + The events are not sent immediately. They are scheduled to be sent + using a pool thread. The effect is that the send occurs asynchronously. + This is very important for a number of non obvious reasons. The remoting + infrastructure will flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + The events to send. + + + + Override base class close. + + + + This method waits while there are queued work items. The events are + sent asynchronously using work items. These items + will be sent once a thread pool thread is available to send them, therefore + it is possible to close the appender before all the queued events have been + sent. + + This method attempts to wait until all the queued events have been sent, but this + method will timeout after 30 seconds regardless. + + If the appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. + + + + + A work item is being queued into the thread pool + + + + + A work item from the thread pool has completed + + + + + Send the contents of the buffer to the remote sink. + + + This method is designed to be used with the . + This method expects to be passed an array of + objects in the state param. + + the logging events to send + + + + The URL of the remote sink. + + + + + The local proxy (.NET remoting) for the remote logging sink. + + + + + The number of queued callbacks currently waiting or executing + + + + + Event used to signal when there are no queued work items + + + This event is set when there are no queued work items. In this + state it is safe to close the appender. + + + + + Gets or sets the URL of the well-known object that will accept + the logging events. + + + The well-known URL of the remote sink. + + + + The URL of the remoting sink that will accept logging events. + The sink must implement the + interface. + + + + + + Interface used to deliver objects to a remote sink. + + + This interface must be implemented by a remoting sink + if the is to be used + to deliver logging events to the sink. + + + + + Delivers logging events to the remote sink + + Array of events to log. + + + Delivers logging events to the remote sink + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + The fully qualified type of the RollingFileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Sets the quiet writer being used. + + + This method can be overridden by sub classes. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + + + Builds a list of filenames for all files matching the base filename plus a file + pattern. + + + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Attempts to extract a number from the end of the file name that indicates + the number of the times the file has been rolled over. + + + Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. + + + + + + + Takes a list of files and a base file name, and looks for + 'incremented' versions of the base file. Bumps the max + count up to the highest count seen. + + + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + + + + .1, .2, .3, etc. + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if is exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + This object supplies the current date/time. Allows test code to plug in + a method to control this class when testing date/time based rolling. The default + implementation uses the underlying value of DateTime.Now. + + + + + The date pattern. By default, the pattern is set to ".yyyy-MM-dd" + meaning daily rollover. + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + The default maximum file size is 10MB + + + + + There is zero backup files by default + + + + + How many sized based backups have been made so far + + + + + The rolling file count direction. + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + Value indicating whether to always log to the same file. + + + + + Value indicating whether to preserve the file name extension when rolling. + + + + + FileName provided in configuration. Used for rolling properly + + + + + The 1st of January 1970 in UTC + + + + + Gets or sets the strategy for determining the current date and time. The default + implementation is to use LocalDateTime which internally calls through to DateTime.Now. + DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying + . + + + An implementation of the interface which returns the current date and time. + + + + Gets or sets the used to return the current date and time. + + + There are two built strategies for determining the current date and time, + + and . + + + The default strategy is . + + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to false, otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to preserve the file name extension when rolling. + + + true if the file name extension should be preserved. + + + + By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. + However, under Windows the new file name will loose any program associations as the + extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or + file.curSizeRollBackup.log to maintain any program associations. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + true if always should be logged to the same file, otherwise false. + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + Style of rolling to use + + + + Style of rolling to use + + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is + configured. + + + Setting this option also sets AppendToFile to + false on the RollingFileAppender, otherwise + this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Implementation of that returns the current time as the coordinated universal time (UTC). + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an e-mail when a specific logging event occurs, typically on errors + or fatal errors. + + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Authentication and setting the server Port are only available on the MS .NET 1.1 runtime. + For these features to be enabled you need to ensure that you are using a version of + the log4net assembly that is built against the MS .NET 1.1 framework and that you are + running the your application on the MS .NET 1.1 runtime. On all other platforms only sending + unauthenticated messages to a server listening on port 25 (the default) is supported. + + + Authentication is supported by setting the property to + either or . + If using authentication then the + and properties must also be set. + + + To set the SMTP server port use the property. The default port is 25. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + Send the email message + + the body text to include in the mail + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses + that will be carbon copied (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses + that will be blind carbon copied. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of recipient e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the name of the SMTP relay mail server to use to send + the e-mail messages. + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + + + Obsolete + + + Use the BufferingAppenderSkeleton Fix methods instead + + + + Obsolete property. + + + + + + The mode to use to authentication with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + Valid Authentication mode values are: , + , and . + The default value is . When using + you must specify the + and to use to authenticate. + When using the Windows credentials for the current + thread, if impersonating, or the process will be used to authenticate. + + + + + + The username to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the username will be ignored. + + + + + + The password to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the password will be ignored. + + + + + + The port on which the SMTP server is listening + + + Server Port is only available on the MS .NET 1.1 runtime. + + The port on which the SMTP server is listening. The default + port is 25. The Port can only be changed when running on + the MS .NET 1.1 runtime. + + + + + + Gets or sets the priority of the e-mail message + + + One of the values. + + + + Sets the priority of the e-mails generated by this + appender. The default priority is . + + + If you are using this appender to report errors then + you may want to set the priority to . + + + + + + Gets or sets the subject encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Gets or sets the body encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Values for the property. + + + + SMTP authentication modes. + + + + + + No authentication + + + + + Basic authentication. + + + Requires a username and password to be supplied + + + + + Integrated authentication + + + Uses the Windows credentials from the current thread or process to authenticate. + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The security context to use for privileged calls + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages + back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored + over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + The fully qualified type of the TelnetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Create the socket handler and wait for connections + + + + + + Writes the logging event to each connected client. + + The event to log. + + + Writes the logging event to each connected client. + + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from + clients. It is threaded so that clients can connect/disconnect + asynchronously. + + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients + + the text to send + + + Sends a string message to each of the connected clients + + + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Callback used to accept a connection on the server socket + + The result of the asynchronous operation + + + On connection adds to the list of connections + if there are two many open connections you will be disconnected + + + + + + Close all network connections + + + + Make sure we close all network connections + + + + + + Test if this handler has active connections + + + true if this handler has active connections + + + + This property will be true while this handler has + active connections, that is at least one connection that + the handler will attempt to send a message to. + + + + + + Class that represents a client connected to this handler + + + + Class that represents a client connected to this handler + + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Write a string to the client + + string to send + + + Write a string to the client + + + + + + Cleanup the clients connection + + + + Close the socket connection. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is the default value for the category parameter + of the Write method. + + + Compact Framework
+ The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
+
+ Douglas de la Torre + Nicko Cadell + Gert Driesen + Ron Grabowski +
+ + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to %logger + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Assembly level attribute that specifies a domain to alias to this assembly's repository. + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's domain to its repository by + specifying this attribute with the name of the target domain. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required domains. + + + Nicko Cadell + Gert Driesen + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + + + + + Gets or sets the repository to alias to this assemby's repository. + + + The repository to alias to this assemby's repository. + + + + The name of the repository to alias to this assemby's repository. + + + + + + Initializes a new instance of the class with + the specified domain to alias to this assembly's repository. + + The domain to alias to this assemby's repository. + + + Obsolete. Use instead of . + + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + The fully qualified type of the BasicConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Initializes the log4net system with a default configuration. + + + + Initializes the log4net logging system using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the log4net system using the specified appender. + + The appender to use to log all logging events. + + + Initializes the log4net system using the specified appender. + + + + + + Initializes the log4net system using the specified appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appender. + + The repository to configure. + The appender to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Initializes the using the specified appenders. + + The repository to configure. + The appenders to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Assembly level attribute that specifies the logging domain for the assembly. + + + + DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + Assemblies are mapped to logging domains. Each domain has its own + logging repository. This attribute specified on the assembly controls + the configuration of the domain. The property specifies the name + of the domain that this assembly is a part of. The + specifies the type of the repository objects to create for the domain. If + this attribute is not specified and a is not specified + then the assembly will be part of the default shared logging domain. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Initializes a new instance of the class. + + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Initialize a new instance of the class + with the name of the domain. + + The name of the domain. + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + The repository to configure. + + + + Configures log4net using a log4net element + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The element to parse. + + + + Configures the using the specified XML + element. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration file. + + A stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Assembly level attribute to configure the . + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + Gert Driesen + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The assembly that this attribute was defined on. + The repository to configure. + + + + The fully qualified type of the XmlConfiguratorAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + The extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Class to register for the log4net section of the configuration file + + + The log4net section of the configuration file needs to have a section + handler registered. This is the section handler used. It simply returns + the XML element that is the root of the section. + + + Example of registering the log4net section handler : + + + +
+ + + log4net configuration XML goes here + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Parses the configuration section. + + The configuration settings in a corresponding parent configuration section. + The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. + The for the log4net section. + The for the log4net section. + + + Returns the containing the configuration data, + + + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + Initializes a new instance of the class + with the specified type. + + The type name of plugin to create. + + + Create the attribute with the plugin type specified. + + + Where possible use the constructor that takes a . + + + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Creates the plugin object defined by this attribute. + + + + Creates the instance of the object as + specified by this attribute. + + + The plugin object. + + + + Returns a representation of the properties of this object. + + + + Overrides base class method to + return a representation of the properties of this object. + + + A representation of the properties of this object + + + + Gets or sets the type for the plugin. + + + The type for the plugin. + + + + The type for the plugin. + + + + + + Gets or sets the type name for the plugin. + + + The type name for the plugin. + + + + The type name for the plugin. + + + Where possible use the property instead. + + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Construct provider attribute with type specified + + the type of the provider to use + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + The fully qualified type of the SecurityContextProviderAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the type of the provider to use. + + + the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration URI. + + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The must support the URI scheme specified. + + + + + + Configures log4net using the specified configuration data stream. + + A stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Maps repository names to ConfigAndWatchHandler instances to allow a particular + ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + reconfigured. + + + + + The fully qualified type of the XmlConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + Watches file for changes. This object should be disposed when no longer + needed to free system handles on the watched resources. + + + + + Initializes a new instance of the class to + watch a specified config file used to configure a repository. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + Release the handles held by the watcher and timer. + + + + + The implementation of the interface suitable + for use with the compact framework + + + + This implementation is a simple + mapping between repository name and + object. + + + The .NET Compact Framework 1.0 does not support retrieving assembly + level attributes therefore unlike the DefaultRepositorySelector + this selector does not examine the calling assembly for attributes. + + + Nicko Cadell + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to lookup to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to lookup to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all of the repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Create a new repository selector + + the type of the repositories to create, must implement + + + Create an new compact repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + throw if is null + throw if does not implement + + + + Get the for the specified assembly + + not used + The default + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Get the named + + the name of the repository to lookup + The named + + + Get the named . The default + repository is log4net-default-repository. Other repositories + must be created using the . + If the named repository does not exist an exception is thrown. + + + throw if is null + throw if the does not exist + + + + Create a new repository for the assembly specified + + not used + the type of repository to create, must implement + the repository created + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + If the is null then the + default repository type specified to the constructor is used. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Create a new repository for the repository specified + + the repository to associate with the + the type of repository to create, must implement . + If this param is null then the default repository type is used. + the repository created + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + If the named repository already exists an exception will be thrown. + + + If is null then the default + repository type specified to the constructor is used. + + + throw if is null + throw if the already exists + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + The fully qualified type of the CompactRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Notify the registered listeners that the repository has been created + + The repository that has been created + + + Raises the LoggerRepositoryCreatedEvent + event. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create an new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to lookup the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to lookup the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Create a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + The fully qualified type of the DefaultRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + An evaluator that triggers on an Exception type + + + + This evaluator will trigger if the type of the Exception + passed to + is equal to a Type in . /// + + + Drew Schaeffer + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + The type that causes the trigger to fire. + + + + + Causes subclasses of to cause the trigger to fire. + + + + + Default ctor to allow dynamic creation through a configurator. + + + + + Constructs an evaluator and initializes to trigger on + + the type that triggers this evaluator. + If true, this evaluator will trigger on subclasses of . + + + + Is this the triggering event? + + The event to check + This method returns true, if the logging event Exception + Type is . + Otherwise it returns false + + + This evaluator will trigger if the Exception Type of the event + passed to + is . + + + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement + + + + This interface supports logging events and testing if a level + is enabled for logging. + + + These methods will not throw exceptions. Note to implementor, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + Generates a logging event for the specified using + the and . + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + + + + Gets the name of the logger. + + + The name of the logger. + + + + The name of this logger + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Get the implementation behind this wrapper object. + + + The object that in implementing this object. + + + + The object that in implementing this + object. The Logger object may not + be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process + the log events. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + + + A + event is raised every time a is created. + + + + + + The created + + + + + Construct instance using specified + + the that has been created + + + Construct instance using specified + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + is the string that is written into the output log. By default + the display name is the same as the level name, but this can be used to alias levels + or to localize the log output. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + Compares levels. + + The object to compare against. + true if the objects are equal. + + + Compares the levels of instances, and + defers to base class if the target object is not a + instance. + + + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + is not a . + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + true if is greater than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + true if is less than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + true if is greater than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + true if is less than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + true if the value of is the same as the + value of ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + true if the value of is different from + the value of ; otherwise, false. + + + + Compares two levels. + + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + Compares two levels. + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + The value of this level. + + + + Gets the value of this level. + + + + + + Gets the display name of this level. + + + The display name of this level. + + + + Gets the display name of this level. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Allow subclasses to avoid our default constructors + + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + An evaluator that triggers at a threshold level + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + The threshold for triggering + + + + + Create a new evaluator using the threshold. + + + + Create a new evaluator using the threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Create a new evaluator using the specified threshold. + + the threshold to trigger at + + + Create a new evaluator using the specified threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Mapping between string name and Level object + + + + Mapping between string name and object. + This mapping is held separately for each . + The level name is case insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case insensitive + + + + + Construct the level map + + + + Construct the level map. + + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + + + Create a new Level and add it to the map + + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + Create a new Level and add it to the map + + + + + + Add a Level to the map + + the Level to add + + + Add a Level to the map + + + + + + Lookup a named level from the map + + the name of the level to lookup is taken from this level. + If the level is not set on the map then this level is added + the level in the map with the name specified + + + Lookup a named level from the map. The name of the level to lookup is taken + from the property of the + argument. + + + If no level with the specified name is found then the + argument is added to the level map + and returned. + + + + + + Lookup a by name + + The name of the Level to lookup + a Level from the map with the name specified + + + Returns the from the + map with the name specified. If the no level is + found then null is returned. + + + + + + Return all possible levels as a list of Level objects. + + all possible levels as a list of Level objects + + + Return all possible levels as a list of Level objects. + + + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + Gets the stack frames from the stack trace of the caller making the log request + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Private constructor to prevent instances. Only static methods should be used. + + + + Private constructor to prevent instances. Only static methods should be used. + + + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shutdown the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to lookup the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shutdown. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to lookup the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to lookup the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + The fully qualified type of the LoggerManager class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initialize the default repository selector + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to lookup a specific repository. + + + For the full .NET Framework, the default repository is DefaultRepositorySelector; + for the .NET Compact Framework CompactRepositorySelector is the default + repository. + + + + + + Implementation of the interface. + + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Constructs a new wrapper for the specified logger. + + The logger to wrap. + + + Constructs a new wrapper for the specified logger. + + + + + + The logger that this object is wrapping + + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + Portable data structure used by + + + + Portable data structure used by + + + Nicko Cadell + + + + The logger name. + + + + The logger name. + + + + + + Level of logging event. + + + + Level of logging event. Level cannot be Serializable + because it is a flyweight. Due to its special serialization it + cannot be declared final either. + + + + + + The application supplied message. + + + + The application supplied message of logging event. + + + + + + The name of thread + + + + The name of thread in which this logging event was generated + + + + + + The time the event was logged + + + + The TimeStamp is stored in the local time zone for this computer. + + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, + like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + Flags passed to the property + + + + Flags passed to the property + + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties. Active properties must implement in order to be eligible for fixing. + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + The level of this event. + The message of this event. + The exception for this event. + + + Except , and , + all fields of LoggingEvent are filled when actually needed. Call + to cache all data locally + to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The method must be called during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Obsolete. Use instead. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix instance fields that hold volatile data. + + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + incurred by calling but it + is essential to maintaining data consistency. + + + Calling is equivalent to + calling passing the parameter + false. + + + See for more + information. + + + + + + Fixes instance fields that hold volatile data. + + Set to true to not fix data that takes a long time to fix. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + The param controls the data that + is fixed. Some of the data that can be fixed takes a long time to + generate, therefore if you do not require those settings to be fixed + they can be ignored by setting the param + to true. This setting will ignore the + and settings. + + + Set to false to ensure that all + settings are fixed. + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Lookup a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine together properties from + several different contexts in the following order: + + + this events properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The application supplied message of logging event. + + + + + The exception that was thrown. + + + This is not serialized. The string representation + is serialized instead. + + + + + The repository that generated the logging event + + + This is not serialized. + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler + changes in the caching strategy. + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored in the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the of the logging event. + + + The of the logging event. + + + + Gets the of the logging event. + + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in the local time zone for this computer. + + + + + + Gets the name of the logger that logged the event. + + + The name of the logger that logged the event. + + + + Gets the name of the logger that logged the event. + + + + + + Gets the location information for this logging event. + + + The location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + Gets the message object used to initialize this event. + Note that this event may not have a valid message object. + If the event is serialized the message object will not + be transferred. To get the text of the message the + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + Gets the exception object used to initialize this event. + Note that this event may not have a valid exception object. + If the event is serialized the exception object will not + be transferred. To get the text of the exception the + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + The string name of the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + The AppDomain friendly name. + + + + Gets the AppDomain friendly name. + + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + The fixed fields in this event + + + The set of fields that are fixed in this event + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Log a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + constructs a method item for an unknown method. + + + + + constructs a method item from the name of the method. + + + + + + constructs a method item from the name of the method and its parameters. + + + + + + + constructs a method item from a method base by determining the method name and its parameters. + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the method name of the caller making the logging + request. + + + The method name of the caller making the logging + request. + + + + Gets the method name of the caller making the logging + request. + + + + + + Gets the method parameters of the caller making + the logging request. + + + The method parameters of the caller making + the logging request + + + + Gets the method parameters of the caller making + the logging request. + + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + returns a stack frame item from a stack frame. This + + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + An evaluator that triggers after specified number of seconds. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + Create a new evaluator using the time threshold in seconds. + + + + Create a new evaluator using the time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Create a new evaluator using the specified time threshold in seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + Create a new evaluator using the specified time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the specified time period + has passed since last check.. + Otherwise it returns false + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + The time threshold in seconds to trigger after + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + lookup the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings + + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Sub classes should override + rather than . + + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Default constructor. + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + The format info for the invariant culture. + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The format string. + + + Initializes a new instance of the class + with the specified format string. + + + The format string must be compatible with the options + that can be supplied to . + + + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + The format string used to format the . + + + + The format string must be compatible with the options + that can be supplied to . + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Points to the next filter in the filter chain. + + + + See for more information. + + + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Default constructor + + + + + Always returns the integer constant + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + flag to indicate if the filter should on a match + + + + + the to match against + + + + + Default constructor + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when matching a + + + + + the minimum value to match + + + + + the maximum value to match + + + + + Default constructor + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + Flag to indicate the behavior when we have a match + + + + + The logger name string to substring match against the event + + + + + Default constructor + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + Simple filter to match a string in the rendered message + + + + Simple filter to match a string in the rendered message + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when we have a match + + + + + The string to substring match against the message + + + + + A string regex to match + + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Default constructor + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + The key to use to lookup the string from the event properties + + + + + Default constructor + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the MDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a sub class). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + The option string to the converter + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + Get the next pattern converter in the chain + + + the next pattern converter in the chain + + + + Get the next pattern converter in the chain + + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + + + + + + Initializes a new instance of the class. + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Flag indicating if this converter handles exceptions + + + false if this converter handles exceptions + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Abstract class that provides access to the current HttpContext () that + derived classes need. + + + This class handles the case when HttpContext.Current is null by writing + to the writer. + + Ron Grabowski + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Cache will + be written to the output. + + + + + + Converter for items in the . + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net HttpContext item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Session will + be written to the output. + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert the pattern into the rendered message + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception or the exception property specified + by the Option value does not exist then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Recognized values for the Option parameter are: + + + + Message + + + Source + + + StackTrace + + + TargetSite + + + HelpLink + + + + + + + Writes the caller location file name to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location file name to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Get the fully qualified string data + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + Return the fully qualified '.' (dot/period) separated string. + + + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + The fully qualified type of the NamedPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + Adam Davies + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + Michael Cromwell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the strack frames to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Returns the Name of the method + + + This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter + string + + + + The fully qualified type of the StackTracePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Write the TimeStamp to the output + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the TimeStamp to the output + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + A flexible layout configurable with pattern string that re-evaluates on each call. + + + This class is built on and provides all the + features and capabilities of PatternLayout. PatternLayout is a 'static' class + in that its layout is done once at configuration time. This class will recreate + the layout on each reference. + One important difference between PatternLayout and DynamicPatternLayout is the + treatment of the Header and Footer parameters in the configuration. The Header and Footer + parameters for DynamicPatternLayout must be syntactically in the form of a PatternString, + but should not be marked as type log4net.Util.PatternString. Doing so causes the + pattern to be statically converted at configuration time and causes DynamicPatternLayout + to perform the same as PatternLayout. + Please see for complete documentation. + + <layout type="log4net.Layout.DynamicPatternLayout"> + <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + </layout> + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + aspnet-cache + + + Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-context + + + Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-request + + + Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-session + + + Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + stacktrace + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktrace{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + This pattern is not available for Compact Framework assemblies. + + + + + stacktracedetail + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktracedetail{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + This pattern is not available for Compact Framework assemblies. + + + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Format modifierleft justifyminimum widthmaximum widthcomment
%20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
%-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
%.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
%20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
%-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
+
+ + Note about caller location information.
+ The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
+ + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
+ + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
+ + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + The header text + + + + See for more information. + + + + + + The footer text + + + + See for more information. + + + + + + Flag indicating if this layout handles exceptions + + + + false if this layout handles exceptions + + + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + Convenience method for easily formatting the logging event into a string variable. + + + + Creates a new StringWriter instance to store the formatted logging event. + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override a this default setting. The default + value is true, this layout does not handle the exception. + + + + + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the m_converterRegistry instance map + + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Initialize the global registry + + + + Defines the builtin global rules. + + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + the event being logged + The TextWriter to write the formatted event to + + + Parse the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternLayout + + the name of the conversion pattern for this converter + the type of the converter + + + Add a named pattern converter to this instance. This + converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + The header PatternString + + + + + The footer PatternString + + + + + Constructs a DynamicPatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + + + + Constructs a DynamicPatternLayout using the supplied conversion pattern + + the pattern to use + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + The pattern will be formatted on each get operation. + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + The pattern will be formatted on each get operation. + + + + + A Layout that renders only the Exception text from the logging event + + + + A Layout that renders only the Exception text from the logging event. + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Constructs a ExceptionLayout + + + + + + Activate component options + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Format the logging event as an object. + + The event to format + returns the formatted event + + + Format the logging event as an object. + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + Type converter for the interface + + + + Used to convert objects to the interface. + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Convert the value to a object + + the value to convert + the object + + + Convert the object to a + object. If the object + is a then the + is used to adapt between the two interfaces, otherwise an + exception is thrown. + + + + + + Extract the value of a property from the + + + + Extract the value of a property from the + + + Nicko Cadell + + + + Constructs a RawPropertyLayout + + + + + Lookup the property for + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + The name of the value to lookup in the LoggingEvent Properties collection. + + + Value to lookup in the LoggingEvent Properties collection + + + + String name of the property to lookup in the . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawUtcTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the even, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format + the as XML. + + + + + + Flag to indicate if location information should be included in + the XML events. + + + + + The string to replace invalid chars with + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + The prefix to use for all generated element names + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether or not to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether or not to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Default constructor + + + + Default constructor + + + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Render the DictionaryEntry argument into a string + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Map class objects to an . + + + + Maintains a mapping between types that require special + rendering and the that + is used to render them. + + + The method is used to render an + object using the appropriate renderers defined in this map. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Default constructor. + + + + + + Render using the appropriate renderer. + + the object to render to a string + the object rendered as a string + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type + + the object to lookup the renderer for + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to lookup the renderer for + the renderer for the specified type + + + Returns the renderer for the specified type. + If no specific renderer has been defined the + will be returned. + + + + + + Internal function to recursively search interfaces + + the type to lookup the renderer for + the renderer for the specified type + + + + Clear the map of renderers + + + + Clear the custom renderers defined by using + . The + cannot be removed. + + + + + + Register an for . + + the type that will be rendered by + the renderer for + + + Register an object renderer for a specific source type. + This renderer will be returned from a call to + specifying the same as an argument. + + + + + + Get the default renderer instance + + the default renderer + + + Get the default renderer + + + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Allow subclasses to avoid our default constructors + + + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + Gets an object that can be used to synchronize access to the collection. + + + An object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + The current element in the collection. + + + + + + + + Map of repository plugins. + + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The repository that the plugins should be attached to. + + + Initialize a new instance of the class with a + repository that the plugins should be attached to. + + + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes a from the map. + + The to remove from the map. + + + Remove a specific plugin from this map. + + + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + Lookup a plugin by name. If the plugin is not found null + will be returned. + + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + Get a collection of all the plugins defined in this map. + + + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The name of this plugin. + + + + + The repository this plugin is attached to. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change one the + plugin has been attached to a repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + Plugin that listens for events from the + + + + This plugin publishes an instance of + on a specified . This listens for logging events delivered from + a remote . + + + When an event is received it is relogged within the attached repository + as if it had been raised locally. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + The property must be set. + + + + + + Construct with sink Uri. + + The name to publish the sink under in the remoting infrastructure. + See for more details. + + + Initializes a new instance of the class + with specified name. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + When the plugin is shutdown the remote logging + sink is disconnected. + + + + + + The fully qualified type of the RemoteLoggingServerPlugin class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the URI of this sink. + + + The URI of this sink. + + + + This is the name under which the object is marshaled. + + + + + + + Delivers objects to a remote sink. + + + + Internal class used to listen for logging events + and deliver them to the local repository. + + + + + + Constructor + + The repository to log to. + + + Initializes a new instance of the for the + specified . + + + + + + Logs the events to the repository. + + The events to log. + + + The events passed are logged to the + + + + + + Obtains a lifetime service object to control the lifetime + policy for this instance. + + null to indicate that this instance should live forever. + + + Obtains a lifetime service object to control the lifetime + policy for this instance. This object should live forever + therefore this implementation returns null. + + + + + + The underlying that events should + be logged to. + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Implementation of used by + + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + This constructor created a new instance and + sets its name. + + The name of the . + + + This constructor is protected and designed to be used by + a subclass that is not abstract. + + + Loggers are constructed by + objects. See for the default + logger creator. + + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + Add to the list of appenders of this + Logger instance. + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Look for the appender named as name + + The name of the appender to lookup + The appender with the name specified, or null. + + + Returns the named appender, or null if the appender is not found. + + + + + + Remove all previously added appenders from this Logger instance. + + + + Remove all previously added appenders from this Logger instance. + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + Remove the appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + Remove the named appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the and . + + + This method must not throw any exception to the caller. + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + This method must not throw any exception to the caller. + + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at + this. If no appenders could be found, emit a + warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + The fully qualified type of the Logger class. + + + + + The name of this logger. + + + + + The assigned level of this logger. + + + + The level variable need not be + assigned a value in which case it is inherited + form the hierarchy. + + + + + + The parent of this logger. + + + + The parent of this logger. + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + Loggers need to know what Hierarchy they are in. + The hierarchy that this logger is a member of is stored + here. + + + + + + Helper implementation of the interface + + + + + Flag indicating if child loggers inherit their parents appenders + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + true if child loggers inherit their parent's appenders. + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this + Logger instance is attached to. + + The hierarchy that this logger belongs to. + + + This logger must be attached to a single . + + + + + + Gets or sets the assigned , if any, for this Logger. + + + The of this logger. + + + + The assigned can be null. + + + + + + Get the appenders contained in this logger as an + . + + A collection of the appenders in this logger + + + Get the appenders contained in this logger as an + . If no appenders + can be found, then a is returned. + + + + + + Gets the logger name. + + + The name of the logger. + + + + The name of this logger + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Construct a new Logger + + the name of the logger + + + Initializes a new instance of the class + with the specified name. + + + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + Delegate used to handle logger creation event notifications. + + + + + + Provides data for the event. + + + + A event is raised every time a + is created. + + + + + + The created + + + + + Constructor + + The that has been created. + + + Initializes a new instance of the event argument + class,with the specified . + + + + + + Gets the that has been created. + + + The that has been created. + + + + The that has been created. + + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class + directly. + + + This class is specialized in retrieving loggers by name and + also maintaining the logger hierarchy. Implements the + interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, + then it creates a provision node for the ancestor and adds itself + to the provision node. Other descendants of the same ancestor add + themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Interface implemented by logger repositories. + + + + This interface is implemented by logger repositories. e.g. + . + + + This interface is used by the + to obtain interfaces. + + + Nicko Cadell + Gert Driesen + + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + The name of the logger to lookup + The Logger object with the name specified + + + If the names logger exists it is returned, otherwise + null is returned. + + + + + + Returns all the currently defined loggers as an Array. + + All the defined loggers + + + Returns all the currently defined loggers as an Array. + + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + Shutdown the repository + + + Shutting down a repository will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The name of the repository + + + The name of the repository + + + + The name of the repository. + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Collection of internal messages captured during the most + recent configuration process. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + + These properties can be specified on a repository specific basis. + + + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The fully qualified type of the LoggerRepositorySkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + Notify any listeners that this repository's configuration has changed. + + + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Contains a list of internal messages captures during the + last configuration. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Initialize the repository using the specified appenders + + the appenders to use to log all logging events + + + Configure the repository to route all logging events to the + specified appenders. + + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Construct with properties + + The properties to pass to this repository. + + + Initializes a new instance of the class. + + + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Construct with properties and a logger factory + + The properties to pass to this repository. + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The Shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + + + Collect the appenders from an container + + + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + true if the repository is disabled for the level argument, false otherwise. + + + + If this hierarchy has not been configured then this method will + always return true. + + + This method will return true if this repository is + disabled for level object passed as parameter and + false otherwise. + + + See also the property. + + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before + invoking this method. + + + + + + Return a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + he loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this + potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + + Define or redefine a Level using the values in the argument + + + Supports setting levels via the configuration file. + + + + + + Set a Property using the values in the argument + + the property value + + + Set a Property using the values in the argument. + + + Supports setting property values via the configuration file. + + + + + + The fully qualified type of the Hierarchy class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Event used to notify that a logger has been created. + + + + Event raised when a logger is created. + + + + + + Has no appender warning been emitted + + + + Flag to indicate if we have already issued a warning + about not having an appender warning. + + + + + + Get the root of this hierarchy + + + + Get the root of this hierarchy. + + + + + + Gets or sets the default instance. + + The default + + + The logger factory is used to create logger instances. + + + + + + A class to hold the value, name and display name for a level + + + + A class to hold the value, name and display name for a level + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Value of the level + + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + + Name of the level + + + The name of the level + + + + The name of the level. + + + + + + Display name for the level + + + The display name of the level + + + + The display name of the level. + + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Determines whether two instances + are equal. + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + Compares the references of the interned strings. + + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of + a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + Initializes a new instance of the class + with the specified child logger. + + + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + Initializes the log4net environment using an XML DOM. + + + + Configures a using an XML DOM. + + + Nicko Cadell + Gert Driesen + + + + Construct the configurator for a hierarchy + + The hierarchy to build. + + + Initializes a new instance of the class + with the specified . + + + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The Hierarchy being configured. + + + + + The fully qualified type of the XmlHierarchyConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + + + + + + + + + + + + + + + + Delegate used to handle logger repository shutdown event notifications + + The that is shutting down. + Empty event args + + + Delegate used to handle logger repository shutdown event notifications. + + + + + + Delegate used to handle logger repository configuration reset event notifications + + The that has had its configuration reset. + Empty event args + + + Delegate used to handle logger repository configuration reset event notifications. + + + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + Delegate used to handle event notifications for logger repository configuration changes. + + + + + + Write the name of the current AppDomain to the output + + + + Write the name of the current AppDomain to the output writer + + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an folder path to the output + + + + Write an special path environment folder path to the output writer. + The value of the determines + the name of the variable to output. + should be a value in the enumeration. + + + Ron Grabowski + + + + Write an special path environment folder path to the output + + the writer to write to + null, state is not set + + + Writes the special path environment folder path to the output . + The name of the special path environment folder path to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentFolderPathPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + The fully qualified type of the IdentityPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + The fully qualified type of the ProcessIdPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters + and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write a randoim string to the output + + the writer to write to + null, state is not set + + + Write a randoim string to the output . + + + + + + The fully qualified type of the RandomStringPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + The fully qualified type of the UserNamePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between + types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + Initializes a new instance of the class. + + + + + Static constructor. + + + + This constructor defines the intrinsic type converters. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + Adds a converter instance for a specific type. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + Adds a converter for a specific type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + The fully qualified type of the ConverterRegistry class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Mapping from to type converter. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + The string type name of the type converter + + + + + Default constructor + + + + Default constructor + + + + + + Create a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Create a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the m_appenderList + + + + + The fully qualified type of the AppenderAttachedImpl class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Base class for Context Properties implementations + + + + This class defines a basic property get set accessor + + + Nicko Cadell + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration by custom + PatternString and PatternLayer converters. + + + + + + default constructor + + + + + + + + + + + Gets or sets the name of the conversion pattern + + + + The name of the pattern in the format string + + + + + + Gets or sets the type of the converter + + + + The value specified must extend the + type. + + + + + + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Adapter that extends and forwards all + messages to an instance of . + + + + Adapter that extends and forwards all + messages to an instance of . + + + Nicko Cadell + + + + The writer to forward messages to + + + + + Create an instance of that forwards all + messages to a . + + The to forward to + + + Create an instance of that forwards all + messages to a . + + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Gets or sets the underlying . + + + The underlying . + + + + Gets or sets the underlying . + + + + + + The Encoding in which the output is written + + + The + + + + The Encoding in which the output is written + + + + + + Gets an object that controls formatting + + + The format provider + + + + Gets an object that controls formatting + + + + + + Gets or sets the line terminator string used by the TextWriter + + + The line terminator to use + + + + Gets or sets the line terminator string used by the TextWriter + + + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + Writes a string to the output. + + + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Flag to indicate if this writer is closed + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Total number of bytes written. + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the event dropped is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + The th oldest event currently in the buffer. + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + The singleton instance of the empty collection. + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + The singleton instance of the empty dictionary. + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + The minimum value. + + + + Gets or sets the minimum value. + + + + + + Gets or sets the maximum value. + + + The maximum value. + + + + Gets or sets the maximum value. + + + + + + Gets or sets a flag indicating whether left align is enabled + or not. + + + A flag indicating whether left align is enabled or not. + + + + Gets or sets a flag indicating whether left align is enabled or not. + + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + Manages a mapping from levels to + + + + Manages an ordered mapping from instances + to subclasses. + + + Nicko Cadell + + + + Default constructor + + + + Initialise a new instance of . + + + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Lookup the mapping for the specified level + + the level to lookup + the for the level or null if no mapping found + + + Lookup the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + + If no mapping could be found then null is returned. + + + + + + Initialize options + + + + Caches the sorted list of in an array + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + This class stores its properties in a slot on the named + log4net.Util.LogicalThreadContextProperties. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Nicko Cadell + + + + Flag used to disable this context if we don't have permission to access the CallContext. + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if is does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets the call context get data. + + The peroperties dictionary stored in the call context + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + Sets the call context data. + + The properties. + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + The fully qualified type of the LogicalThreadContextProperties class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Get or set the property value for the specified. + + + + + + + + + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + Formats Prefix, Source, and Message in the same format as the value + sent to Console.Out and Trace.Write. + + + + + + Initializes a new instance of the class. + + + + + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Writes log4net internal debug messages to the + standard output stream. + + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Default debug level + + + + + In quietMode not even errors generate any output. + + + + + The event raised when an internal message has been received. + + + + + The Type that generated the internal message. + + + + + The DateTime stamp of when the internal message was received. + + + + + A string indicating the severity of the internal message. + + + "log4net: ", + "log4net:ERROR ", + "log4net:WARN " + + + + + The internal log message. + + + + + The Exception related to the message. + + + Optional. Will be null if no Exception was passed. + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + Test if LogLog.Warn is enabled for output. + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Subscribes to the LogLog.LogReceived event and stores messages + to the supplied IList instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a native error code and message. + + + + Represents a Win32 platform native error. + + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + Create an instance of the class with the specified + error number and message. + + + + + + Create a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + The message of the native error. + + + + + Gets the message of the native error. + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is processed using the LogLog sub-system by default. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Reset the error handler back to its initial disabled state. + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log the very first error + + The error message. + The exception. + The internal error code. + + + Sends the error information to 's Error method. + + + + + + Log an Error + + The error message. + The exception. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log an error + + The error message. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + The date the error was recorded. + + + + + Flag to indicate if it is the first error + + + + + The message recorded during the first error. + + + + + The exception recorded during the first error. + + + + + The error code recorded during the first error. + + + + + String to prefix each message with + + + + + The fully qualified type of the OnlyOnceErrorHandler class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Is error logging enabled + + + + Is error logging enabled. Logging is only enabled for the + first error delivered to the . + + + + + + The date the first error that trigged this error handler occured. + + + + + The message from the first error that trigged this error handler. + + + + + The exception from the first error that trigged this error handler. + + + May be . + + + + + The error code from the first error that trigged this error handler. + + + Defaults to + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + The fully qualified type of the OptionConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + Parses the pattern into a chain of pattern converters. + + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + Build the unified cache of converters from the static and instance maps + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + Internal map of converter identifiers to converter types + + + + This map overrides the static s_globalRulesRegistry map. + + + + + + The fully qualified type of the PatternParser class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Get the converter registry used by this parser + + + The converter registry used by this parser + + + + Get the converter registry used by this parser + + + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + date + + + Used to output the current date and time in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Initialize the global registry + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Add a converter to this PatternString + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + Add a converter to this PatternString + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + String keyed object map. + + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + The Hashtable used to store the properties data + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + + See + + + + + + + Remove all properties from the properties collection + + + + + See + + + + + + + See + + + + + + + See + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + The number of properties in this collection + + + + + See + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + the key to lookup in the collection + true if the collection contains the specified key + + + Test if this collection contains a specified key. + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + + + See + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + A class to hold the key and data for a property set in the config file + + + + A class to hold the key and data for a property set in the config file + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Property Key + + + Property Key + + + + Property Key. + + + + + + Property Value + + + Property Value + + + + Property Value. + + + + + + A that ignores the message + + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + + Create a new ProtectCloseTextWriter using a writer + + + + + + Attach this instance to a different underlying + + the writer to attach to + + + Attach this instance to a different underlying + + + + + + Does not close the underlying output writer. + + + + Does not close the underlying output writer. + This method does nothing. + + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + A that can be and reused + + + + A that can be and reused. + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Create an instance of + + the format provider to use + + + Create an instance of + + + + + + Override Dispose to prevent closing of writer + + flag + + + Override Dispose to prevent closing of writer + + + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + + + Utility class of static methods for system specific information. + + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Private constructor to prevent instances. + + + + Only static methods are exposed from this type. + + + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the fully qualified name of the , including + the name of the assembly from which the was + loaded. + + The to get the fully qualified name for. + The fully qualified name for the . + + + This is equivalent to the Type.AssemblyQualifiedName property, + but this method works on the .NET Compact Framework 1.0 as well as + the full .NET runtime. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Use this rather than Assembly.GetName().Name because that + is not available on the Compact Framework. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the + assembly that is directly calling this method. If the type is not found + in the assembly then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Generate a new guid + + A new Guid + + + Generate a new guid + + + + + + Create an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + the ArgumentOutOfRangeException object + + + Create a new instance of the class + with a specified error message, the parameter name, and the value + of the argument. + + + The Compact Framework does not support the 3 parameter constructor for the + type. This method provides an + implementation that works for all platforms. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + Configuration APIs are not supported under the Compact Framework + + + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Gets an empty array of types. + + + + The Type.EmptyTypes field is not available on + the .NET Compact Framework 1.0. + + + + + + The fully qualified type of the SystemInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Text to output when a null is encountered. + + + + + Text to output when an unsupported feature is requested. + + + + + Start time for the current process. + + + + + Gets the system dependent line terminator. + + + The system dependent line terminator. + + + + Gets the system dependent line terminator. + + + + + + Gets the base directory for this . + + The base directory path for the current . + + + Gets the base directory for this . + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + The path to the configuration file for the current . + + + The .NET Compact Framework 1.0 does not have a concept of a configuration + file. For this runtime, we use the entry assembly location as the root for + the configuration file name. + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + The path to the entry assembly. + + + Gets the path to the file that first executed in the current . + + + + + + Gets the ID of the current thread. + + The ID of the current thread. + + + On the .NET framework, the AppDomain.GetCurrentThreadId method + is used to obtain the thread ID for the current thread. This is the + operating system ID for the thread. + + + On the .NET Compact Framework 1.0 it is not possible to get the + operating system thread ID for the current thread. The native method + GetCurrentThreadId is implemented inline in a header file + and cannot be called. + + + On the .NET Framework 2.0 the Thread.ManagedThreadId is used as this + gives a stable id unrelated to the operating system thread ID which may + change if the runtime is using fibers. + + + + + + Get the host name or machine name for the current machine + + + The hostname or machine name + + + + Get the host name or machine name for the current machine + + + The host name () or + the machine name (Environment.MachineName) for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Get this application's friendly name + + + The friendly name of this application as a string + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the start time for the current process. + + + + This is the time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Utility class that represents a format string. + + + + Utility class that represents a format string. + + + Nicko Cadell + + + + Initialise the + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + The fully qualified type of the SystemStringFormat class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + Each thread will automatically have its instance. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Get the keys stored in the properties. + + + Gets the keys stored in the properties. + + a set of the defined keys + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Characters illegal in XML 1.0 + + + + + Impersonate a Windows Account + + + + This impersonates a Windows account. + + + How the impersonation is done depends on the value of . + This allows the context to either impersonate a set of user credentials specified + using username, domain name and password or to revert to the process credentials. + + + + + + Default constructor + + + + Default constructor + + + + + + Initialize the SecurityContext based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The security context will try to Logon the specified user account and + capture a primary token for impersonation. + + + The required , + or properties were not specified. + + + + Impersonate the Windows account specified by the and properties. + + caller provided state + + An instance that will revoke the impersonation of this SecurityContext + + + + Depending on the property either + impersonate a user using credentials supplied or revert + to the process credentials. + + + + + + Create a given the userName, domainName and password. + + the user name + the domain name + the password + the for the account specified + + + Uses the Windows API call LogonUser to get a principal token for the account. This + token is used to initialize the WindowsIdentity. + + + + + + Gets or sets the impersonation mode for this security context + + + The impersonation mode for this security context + + + + Impersonate either a user with user credentials or + revert this thread to the credentials of the process. + The value is one of the + enum. + + + The default value is + + + When the mode is set to + the user's credentials are established using the + , and + values. + + + When the mode is set to + no other properties need to be set. If the calling thread is + impersonating then it will be reverted back to the process credentials. + + + + + + Gets or sets the Windows username for this security context + + + The Windows username for this security context + + + + This property must be set if + is set to (the default setting). + + + + + + Gets or sets the Windows domain name for this security context + + + The Windows domain name for this security context + + + + The default value for is the local machine name + taken from the property. + + + This property must be set if + is set to (the default setting). + + + + + + Sets the password for the Windows account specified by the and properties. + + + The password for the Windows account specified by the and properties. + + + + This property must be set if + is set to (the default setting). + + + + + + The impersonation modes for the + + + + See the property for + details. + + + + + + Impersonate a user using the credentials supplied + + + + + Revert this the thread to the credentials of the process + + + + + Adds to + + + + Helper class to expose the + through the interface. + + + + + + Constructor + + the impersonation context being wrapped + + + Constructor + + + + + + Revert the impersonation + + + + Revert the impersonation + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + Private Constructor. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + The global context properties instance + + + + + The global properties map. + + + The global properties map. + + + + The global properties map. + + + + + + Provides information about the environment the assembly has + been built for. + + + + Version of the assembly + + + Version of the framework targeted + + + Type of framework targeted + + + Does it target a client profile? + + + + Identifies the version and target for this assembly. + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + The thread properties map + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The logical thread stacks. + + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + Returns the named logger if it exists. + + Returns the named logger if it exists. + + + + If the named logger exists (in the default repository) then it + returns a reference to the logger, otherwise it returns null. + + + The fully qualified logger name to look for. + The logger found, or null if no logger could be found. + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + Get the currently defined loggers. + + Returns all the currently defined loggers in the default repository. + + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + Get or create a logger. + + Retrieves or creates a named logger. + + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to lookup the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + Shutdown a logger repository. + + Shuts down the default repository. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + default repository. + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shutdown. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to lookup the repository. + + + Reset the configuration of a repository + + Resets all values contained in this repository instance to their defaults. + + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to lookup the repository to reset. + + + Get the logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Get a logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Create a domain + + Creates a repository with the specified repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + Create a logger repository. + + Creates a repository with the specified repository type. + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + + + + Creates a repository with the specified name. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using(NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + diff --git a/packages/log4net.2.0.3/lib/net20-full/log4net.dll b/packages/log4net.2.0.3/lib/net20-full/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..3b32146c23ef1a537d392df0bba436958cf4bcfb GIT binary patch literal 303104 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