From cfca6d408164731e35c90d00a55f3fbb2dfb9e4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=20Pa=C5=BEourek?= Date: Thu, 23 Sep 2021 18:06:48 +0200 Subject: [PATCH] Added Common.Logging.Log4Net2012 package --- Common.Logging.2010-net20.sln | 23 + Common.Logging.2010.sln | 23 + lib/Log4Net2012/net20/log4net.dll | Bin 0 -> 262144 bytes lib/Log4Net2012/net20/log4net.xml | 31401 +++++++++++++++ lib/Log4Net2012/net40/log4net.dll | Bin 0 -> 270336 bytes lib/Log4Net2012/net40/log4net.xml | 32444 ++++++++++++++++ .../AssemblyInfo.cs | 5 + ...mmon.Logging.Log4Net2012.2010-net40.csproj | 96 + .../Common.Logging.Log4Net2012.2010.csproj | 128 + .../Common.Logging.Log4Net2012.nuspec | 28 + .../AssemblyInfo.cs | 29 + ...et2012.Tests.Integration.2010-net40.csproj | 121 + ....Log4Net2012.Tests.Integration.2010.csproj | 117 + ...ogging.Log4Net2012.Tests.2010-net40.csproj | 124 + ...mmon.Logging.Log4Net2012.Tests.2010.csproj | 125 + ...monLoggingAppenderTests_log4net.config.xml | 16 + 16 files changed, 64680 insertions(+) create mode 100644 lib/Log4Net2012/net20/log4net.dll create mode 100644 lib/Log4Net2012/net20/log4net.xml create mode 100644 lib/Log4Net2012/net40/log4net.dll create mode 100644 lib/Log4Net2012/net40/log4net.xml create mode 100644 src/Common.Logging.Log4Net2012/AssemblyInfo.cs create mode 100644 src/Common.Logging.Log4Net2012/Common.Logging.Log4Net2012.2010-net40.csproj create mode 100644 src/Common.Logging.Log4Net2012/Common.Logging.Log4Net2012.2010.csproj create mode 100644 src/Common.Logging.Log4Net2012/Common.Logging.Log4Net2012.nuspec create mode 100644 test/Common.Logging.Log4Net2012.Integration.Tests/AssemblyInfo.cs create mode 100644 test/Common.Logging.Log4Net2012.Integration.Tests/Common.Logging.Log4Net2012.Tests.Integration.2010-net40.csproj create mode 100644 test/Common.Logging.Log4Net2012.Integration.Tests/Common.Logging.Log4Net2012.Tests.Integration.2010.csproj create mode 100644 test/Common.Logging.Log4Net2012.Tests/Common.Logging.Log4Net2012.Tests.2010-net40.csproj create mode 100644 test/Common.Logging.Log4Net2012.Tests/Common.Logging.Log4Net2012.Tests.2010.csproj create mode 100644 test/Common.Logging.Log4Net2012.Tests/Logging/Log4Net/CommonLoggingAppenderTests_log4net.config.xml diff --git a/Common.Logging.2010-net20.sln b/Common.Logging.2010-net20.sln index 7408543..f98a43a 100644 --- a/Common.Logging.2010-net20.sln +++ b/Common.Logging.2010-net20.sln @@ -136,6 +136,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Logging.Log4Net1215. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleWebApplication", "examples\SimpleWebApplication\SimpleWebApplication.csproj", "{F815965A-089B-4F42-A901-38EBDB3152C2}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Log4Net-2.0.12", "Log4Net-2.0.12", "{88BDCCAE-F7E0-49CB-9C9B-44BB69C3F801}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Logging.Log4Net2012.2010", "src\Common.Logging.Log4Net2012\Common.Logging.Log4Net2012.2010.csproj", "{3F5B8D80-5985-4DBA-BD0E-7ABF0F786456}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Logging.Log4Net2012.Tests.2010", "test\Common.Logging.Log4Net2012.Tests\Common.Logging.Log4Net2012.Tests.2010.csproj", "{1AE6C0BD-AC90-4EE4-AD16-56EAADE01902}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Logging.Log4Net2012.Tests.Integration.2010", "test\Common.Logging.Log4Net2012.Integration.Tests\Common.Logging.Log4Net2012.Tests.Integration.2010.csproj", "{E16E38CF-DA06-4933-9EC6-886071EEB9A8}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Log4Net-2.0.8", "Log4Net-2.0.8", "{28FE16F5-860B-4090-816D-9B2D6AE377F3}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Logging.Log4Net208.2010", "src\Common.Logging.Log4Net208\Common.Logging.Log4Net208.2010.csproj", "{13DDF21A-EC30-4D1E-A723-D2E8E7F8839E}" @@ -394,6 +402,18 @@ Global {28999DB7-28EC-4C86-A972-A7EEF5AB08A7}.Debug|Any CPU.Build.0 = Debug|Any CPU {28999DB7-28EC-4C86-A972-A7EEF5AB08A7}.Release|Any CPU.ActiveCfg = Release|Any CPU {28999DB7-28EC-4C86-A972-A7EEF5AB08A7}.Release|Any CPU.Build.0 = Release|Any CPU + {3F5B8D80-5985-4DBA-BD0E-7ABF0F786456}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3F5B8D80-5985-4DBA-BD0E-7ABF0F786456}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3F5B8D80-5985-4DBA-BD0E-7ABF0F786456}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3F5B8D80-5985-4DBA-BD0E-7ABF0F786456}.Release|Any CPU.Build.0 = Release|Any CPU + {1AE6C0BD-AC90-4EE4-AD16-56EAADE01902}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1AE6C0BD-AC90-4EE4-AD16-56EAADE01902}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1AE6C0BD-AC90-4EE4-AD16-56EAADE01902}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1AE6C0BD-AC90-4EE4-AD16-56EAADE01902}.Release|Any CPU.Build.0 = Release|Any CPU + {E16E38CF-DA06-4933-9EC6-886071EEB9A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E16E38CF-DA06-4933-9EC6-886071EEB9A8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E16E38CF-DA06-4933-9EC6-886071EEB9A8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E16E38CF-DA06-4933-9EC6-886071EEB9A8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -447,6 +467,9 @@ Global {D571B0F3-4F3C-4CCD-B8E6-A945CF1C65AB} = {4CED1A73-34E3-4690-8E9D-CD82A0D2F47F} {5512AF3A-4FCB-4236-8E3C-6DB7AA8A973C} = {4CED1A73-34E3-4690-8E9D-CD82A0D2F47F} {F815965A-089B-4F42-A901-38EBDB3152C2} = {233DC5FA-FFB8-43A7-BDFD-B6AD5DC35264} + {3F5B8D80-5985-4DBA-BD0E-7ABF0F786456} = {88BDCCAE-F7E0-49CB-9C9B-44BB69C3F801} + {1AE6C0BD-AC90-4EE4-AD16-56EAADE01902} = {88BDCCAE-F7E0-49CB-9C9B-44BB69C3F801} + {E16E38CF-DA06-4933-9EC6-886071EEB9A8} = {88BDCCAE-F7E0-49CB-9C9B-44BB69C3F801} {13DDF21A-EC30-4D1E-A723-D2E8E7F8839E} = {28FE16F5-860B-4090-816D-9B2D6AE377F3} {77333B27-C652-442E-BD9C-8E884811790C} = {28FE16F5-860B-4090-816D-9B2D6AE377F3} {386A1888-CB4D-4EA0-9875-47E1D5D1D6B4} = {28FE16F5-860B-4090-816D-9B2D6AE377F3} diff --git a/Common.Logging.2010.sln b/Common.Logging.2010.sln index 2df4057..4167424 100644 --- a/Common.Logging.2010.sln +++ b/Common.Logging.2010.sln @@ -212,6 +212,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Logging.NLog4411.Tes EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Logging.NLog4411.Tests.Integration.2010-net40", "test\Common.Logging.NLog4411.Integration.Tests\Common.Logging.NLog4411.Tests.Integration.2010-net40.csproj", "{2CDCCD56-CFC7-4EFC-990F-34248EF9A3E1}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Log4Net-2.0.12", "Log4Net-2.0.12", "{0CD51E32-F076-473E-9DC9-3F6D830759C5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Logging.Log4Net2012.2010-net40", "src\Common.Logging.Log4Net2012\Common.Logging.Log4Net2012.2010-net40.csproj", "{F1731675-AE3F-41AE-8DB6-4069D28F1DA0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Logging.Log4Net2012.Tests.Integration.2010-net40", "test\Common.Logging.Log4Net2012.Integration.Tests\Common.Logging.Log4Net2012.Tests.Integration.2010-net40.csproj", "{5B086217-D343-4BB1-8750-BF22AF66C7FD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Logging.Log4Net2012.Tests.2010-net40", "test\Common.Logging.Log4Net2012.Tests\Common.Logging.Log4Net2012.Tests.2010-net40.csproj", "{BE30142E-A7A1-46CA-AED4-B2DA5675EBA3}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Log4Net-2.0.8", "Log4Net-2.0.8", "{030AE8CC-C1E2-44CE-8825-51B3AB978343}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Logging.Log4Net208.2010-net40", "src\Common.Logging.Log4Net208\Common.Logging.Log4Net208.2010-net40.csproj", "{9E443037-619D-4D49-988A-D8D1F18F379A}" @@ -609,6 +617,18 @@ Global {FD1B1313-BF7E-4EB7-910A-D8ABA9A33697}.Debug|Any CPU.Build.0 = Debug|Any CPU {FD1B1313-BF7E-4EB7-910A-D8ABA9A33697}.Release|Any CPU.ActiveCfg = Release|Any CPU {FD1B1313-BF7E-4EB7-910A-D8ABA9A33697}.Release|Any CPU.Build.0 = Release|Any CPU + {F1731675-AE3F-41AE-8DB6-4069D28F1DA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F1731675-AE3F-41AE-8DB6-4069D28F1DA0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F1731675-AE3F-41AE-8DB6-4069D28F1DA0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F1731675-AE3F-41AE-8DB6-4069D28F1DA0}.Release|Any CPU.Build.0 = Release|Any CPU + {5B086217-D343-4BB1-8750-BF22AF66C7FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5B086217-D343-4BB1-8750-BF22AF66C7FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5B086217-D343-4BB1-8750-BF22AF66C7FD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5B086217-D343-4BB1-8750-BF22AF66C7FD}.Release|Any CPU.Build.0 = Release|Any CPU + {BE30142E-A7A1-46CA-AED4-B2DA5675EBA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BE30142E-A7A1-46CA-AED4-B2DA5675EBA3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BE30142E-A7A1-46CA-AED4-B2DA5675EBA3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BE30142E-A7A1-46CA-AED4-B2DA5675EBA3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -690,6 +710,9 @@ Global {EF248164-247A-42FF-9687-0D49922C9959} = {941C76F2-F300-442B-BB2E-81423E3CCC3F} {87816DB0-B205-4349-A783-32360C02B558} = {941C76F2-F300-442B-BB2E-81423E3CCC3F} {2CDCCD56-CFC7-4EFC-990F-34248EF9A3E1} = {941C76F2-F300-442B-BB2E-81423E3CCC3F} + {F1731675-AE3F-41AE-8DB6-4069D28F1DA0} = {030AE8CC-C1E2-44CE-8825-51B3AB978343} + {5B086217-D343-4BB1-8750-BF22AF66C7FD} = {030AE8CC-C1E2-44CE-8825-51B3AB978343} + {BE30142E-A7A1-46CA-AED4-B2DA5675EBA3} = {030AE8CC-C1E2-44CE-8825-51B3AB978343} {9E443037-619D-4D49-988A-D8D1F18F379A} = {030AE8CC-C1E2-44CE-8825-51B3AB978343} {1FE974B8-8BAD-408F-82C2-07E329A22219} = {030AE8CC-C1E2-44CE-8825-51B3AB978343} {AABB8CAA-00B3-436F-B440-35E5DAA72763} = {030AE8CC-C1E2-44CE-8825-51B3AB978343} diff --git a/lib/Log4Net2012/net20/log4net.dll b/lib/Log4Net2012/net20/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..32236f506729d8acdcbfb602801754f71a332a42 GIT binary patch literal 262144 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�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 Gf&T+=dSYJy literal 0 HcmV?d00001 diff --git a/lib/Log4Net2012/net20/log4net.xml b/lib/Log4Net2012/net20/log4net.xml new file mode 100644 index 0000000..b4c2121 --- /dev/null +++ b/lib/Log4Net2012/net20/log4net.xml @@ -0,0 +1,31401 @@ + + + + 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 + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + 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. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + This property requires at least .NET 2.0. + + + + + 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. + + + If this property is not set, the command text is retrieved by invoking + . + + + + + + 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. + + + + + 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 + + + + Connects to the database. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + 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. + + + + + Database connection string. + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings 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 reconnect when a connection is lost. + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + 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 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 + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + 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". + + + + + + 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + 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. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Ansi code to reset terminal + + + + + 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. + + + + + + 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 + + + + + + Initialize the options for the object + + + + Combine the and together + and append the attributes. + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + 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. + + + + + 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. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the AppenderCollection. + + + + + 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. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + 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 . + + + + + 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 . + + + + + 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 + + + + Returns an enumerator that can iterate through the AppenderCollection. + + An for the entire AppenderCollection. + + + + Gets or sets the number of elements the AppenderCollection can contain. + + + + + 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 . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + 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. + + + + + + + + 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 + + + + 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 . + + + + + + 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. + + + + + + + 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. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + + The name uniquely identifies the appender. + + + + + + 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. + + + + + + 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. + + + + + Flushes any buffered log data. + + + This implementation doesn't flush anything and always returns true + + True if all logging events were flushed successfully, else false. + + + + 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 + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + 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 + (). + + + + + + 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. + + + + + + + + Defaults to %logger + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + 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 default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + 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. + + + + + 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 + + + + 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. + + + + + + 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. + + + + + 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 + + + + + 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 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 + + + + + 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. + + + + + 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". + + + + + + 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + 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 + + + + 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. + + + + + 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 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + Formats the category parameter sent to the Debug method. + + + + Defaults to a with %logger as the pattern which will use the logger name of the current + as the category parameter. + + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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 a with %logger as the pattern. + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + 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 + + + + + + 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. + + + + + + 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 + + + + Write only that uses the + to manage access to an underlying resource. + + + + + True asynchronous writes are not supported, the implementation forces a synchronous write. + + + + + 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. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + 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. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + 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 + + + + + + Releases the lock and allows others to acquire a lock. + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + 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. + + + + + + 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 . + + + + + + 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. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + 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 + + + + + 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 that can be implemented by Appenders that buffer logging data and expose a method. + + + + + Flushes any buffered log data. + + + Appenders that implement the method must do so in a thread-safe manner: it can be called concurrently with + the method. + + Typically this is done by locking on the Appender instance, e.g.: + + + + + + The parameter is only relevant for appenders that process logging events asynchronously, + such as . + + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + 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 + + + + 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 + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a local syslog service. + + + + + 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 . + + + + + 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 + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + 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 + + + + + + Appends colorful logging events to the console, using the .NET 2 + built-in capabilities. + + + + ManagedColoredConsoleAppender 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. + + + When configuring the colored console appender, mappings should be + specified to map logging levels to colors. For example: + + + + + + + + + + + + + + + + + + + + + + The Level is the standard log4net logging level while + ForeColor and BackColor are the values of + enumeration. + + + Based on the ColoredConsoleAppender + + + Rick Hobbs + Nicko Cadell + Pavlos Touboulidis + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard 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". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + 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. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + 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. + + + + + + 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. + + + + + + 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 + and clear the current list of events that have been appended. + + + Use the method to get the current + list of events that have been appended. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Use the method to clear the + current list of events. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + 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. + + + + + + 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. + + + + + + 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 + + + + + Gets the events that have been logged and clears the list of events. + + The events that have been logged + + + Gets the events that have been logged and clears 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 + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + + 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 + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Stub for OutputDebugString native method + + the string to output + + + Stub for OutputDebugString native method + + + + + + 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 + + + + Syslog port 514 + + + + + 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 + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + 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 . + + + + + 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 + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + 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. + + + + + 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 + + + + 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 + + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Cleans up all resources used by this appender. + + + + + 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! + + + + + + 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 + + + + + A mutex that is used to lock rolling of files. + + + + + The 1st of January 1970 in UTC + + + + + 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 + + + + + + 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 . + + + + + + Enable or disable use of SSL when sending e-mail message + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the reply-to e-mail address. + + + This is available on MS .NET 2.0 runtime and higher + + + + + 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. + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Send the email message + + the body text to include in the mail + + + + 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. + + + + + trims leading and trailing commas or semicolons + + + + + 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 + + + + + + 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 file extension for the generated files + + + The file extension for the generated files + + + + The file extension for the generated files + + + + + + 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. + + + + + + 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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 + + + + + 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. + + + + + 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 . + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + 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 + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + 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. + + + + + + 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. + + + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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 + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + 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. + + + + + 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. + + + + + 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 . + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + 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 + + + + 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 . + + + + + + 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. + + + + + + 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 appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + 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 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 + + + + 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 + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + Gets or sets the type of the provider to use. + + + 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. + + + + + 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 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. + + + + 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. + + + + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + 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 XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + 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 . + + + + + + + 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. + + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + 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. + + + + + 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. + + + + + 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 + + + + + + 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. + + + + + + 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. + + + + + 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 + + + + 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. + + + + + 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 . + + + + + + Notify the registered listeners that the repository has been created + + The repository that has been created + + + Raises the LoggerRepositoryCreatedEvent + event. + + + + + + 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 + + + + 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 . + + + + + + 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. + + + + + 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 + + + + 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 . + + + + 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 . + + + + + + 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 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. + + + + + + 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. + + + + + + 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 + + + + Gets the name of the logger. + + + The name of the logger. + + + + The name of this logger + + + + + + 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 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. + + + + + + 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. + + + + + + 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 + + + + + + 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 . + + + + + + 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 + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Gets the current element in the collection. + + + + + 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. + + + + + 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. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + 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. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + 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 . + + + + + 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 . + + + + + 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 + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + 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 . + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + + 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. + + + + + + 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 + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + 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 + + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + + The logger that this object is wrapping + + + + + 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 + + + + + + Gets or sets the local time the event was logged + + + + Prefer using the setter, since local time can be ambiguous. + + + + + + Gets or sets the UTC time the event was logged + + + + The TimeStamp is stored in the UTC time zone. + + + + + + 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 + + + + 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. + + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored internally in UTC and converted to 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 UTC time when the current process started. + + + This is the UTC time when this process started. + + + + 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 UTC and converted to the local time zone for this computer. + + + + + + Gets UTC the time of the logging event. + + + The UTC time of the logging event. + + + + + 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. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + 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. + + + + + + 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. + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + + provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + + returns a stack frame item from a stack frame. This + + + + + + + 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) + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + 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 time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The UTC time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 . + + + + + + 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. + + + + + 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 + + + + 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 . + + + + + + 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. + + + + + 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. + + + + + 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. + + + + + + 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 + + + + 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. + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + 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 . + + + + + + 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 . + + + + + + 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 + + + + + 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 . + + + + + + 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. + + + + + + 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 + + + + + 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 . + + + + + + 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. + + + + + + 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 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". + + + + + + 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 + + + + The key to use to lookup the string from the event properties + + + + + Default constructor + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 properties map. + + + The global properties map. + + + + The global properties map. + + + + + + The global context properties instance + + + + + 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 . + + + + + + + + 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> + + + + + + 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 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. + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + 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 +
+ + + 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. + + + + + + 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. + + + + + + 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. + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + 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 + + + + 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. + + + + + + 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. + + + + 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 + + + + 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 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. + + + + + 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. + + + + + + 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 + + + + Initializes a new instance of the class. + + + + + 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. + + + + + + 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 + + + + + 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 + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + 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. + + + + + 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. + + + + + 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 + + + + 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 + + + + + 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 . + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + + + 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. + + + + + + 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". + + + + + + 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 + + + + + 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. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + 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 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. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + 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 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. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + 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. + + + 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. + + + 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. + + + + 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. + + + + + 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. + + + + 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. + + + + Flushes logging events buffered in all configured appenders in the default repository. + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed. + True if all logging events were flushed successfully, else false. + + + + 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. + + + + + 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. + + + + + + + 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"); + } + + + + + + Pushes a new context message. + + The new context message string format. + Arguments to be passed into messageFormat. + + 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. + + var someValue = "ExampleContext" + using(log4net.NDC.PushFormat("NDC_Message {0}", someValue)) + { + 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. + + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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 + + + + Get the default renderer instance + + the default renderer + + + Get the default renderer + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + 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. + + + + + 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. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + 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. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + 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 . + + + + + 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 . + + + + + 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. + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + 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 . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + The current element in the collection. + + + + + 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. + + + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + + 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 repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + The name of this plugin. + + + + + The repository 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. + + + + + + Gets or sets the URI of this sink. + + + The URI of this sink. + + + + This is the name under which the object is marshaled. + + + + + + + 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. + + + + + 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 + + + + 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. + + + + + + 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 + + + + Event used to notify that a logger has been created. + + + + Event raised when a logger is created. + + + + + + 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 . + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + + 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. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + Gets the logger name. + + + The name of the logger. + + + + The name of this logger + + + + + + 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. + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + 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. + + + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + 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. + + + + + + Flushes all configured Appenders that implement . + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed, + or to wait indefinitely. + True if all logging events were flushed successfully, else false. + + + + 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 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. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + 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 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. + + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + 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. + + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + 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. + + + + The singleton instance of the empty dictionary. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + + 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 + + + + + + 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 any options defined on this entry + + + + Should be overridden by any classes that need to initialise based on their options + + + + + + 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. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + 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. + + + + + + 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. + + + + + + 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. + + + + + Delegate type used for LogicalThreadContextStack's callbacks. + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + The name of this within the + . + + + + + The callback used to let the register a + new instance of a . + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + 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. + + + + + + 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 thread 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.LogicalThreadContext.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.LogicalThreadContext.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 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. + + + + + + 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 + + + + + + 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 depth to trim the stack to when this instance is disposed + + + + + The outer LogicalThreadContextStack. + + + + + 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. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + + + + + + + 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 + + + + 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. + + + + + The UTC 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. + + + + + 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. + + + + + + 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 : + + + + + + + + + + + + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + 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: ". + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + Test if LogLog.Warn is enabled for output. + + + + + + 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 ". + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + 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 . + + + + + + 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. + + + + + + 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. + + + + 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. + + + + + + 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. + + + + The singleton instance of the . + + + + + 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. + + + + + + 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. + + + + 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 . + + + + + 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. + + + + + + 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 occurred, or if it has not been triggered. + + + + + The UTC date the first error that trigged this error handler occured, or if it has not been triggered. + + + + + 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 + + + + + The UTC 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. + + + + + 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. + + + + + 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 + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + 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 + + + + + + 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 + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + 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. + + + + + + + + + + + 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. + + + + + + Get the converter registry used by this parser + + + The converter registry used by this parser + + + + Get the converter registry used by this parser + + + + + + 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 + + + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + 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. + + + + + 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. + + + + + appsetting + + + Used to output the value of a specific appSetting key in the application + configuration file. + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + + 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 . + + + + + + AppSetting pattern converter + + + + This pattern converter reads appSettings from the application configuration file. + + + If the is specified then that will be used to + lookup a single appSettings value. If no is specified + then all appSettings will be dumped as a list of key value pairs. + + + A typical use is to specify a base directory for log files, e.g. + + + + + ... + + + ]]> + + + + + + + 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. + + + + + + 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. + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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 + + + 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 + + + + + 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 + + + + + + Property Key + + + Property Key + + + + Property Key. + + + + + + Property Value + + + Property Value + + + + Property Value. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + 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. + + + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + 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. + + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + 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 + + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + The number of properties in this collection + + + + + See + + + + + See + + + + + 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 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. + + + + + + Get the UTC start time for the current process. + + + + This is the UTC 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. + + + + + + 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. + + + + + + Tests two strings for equality, the ignoring case. + + + If the platform permits, culture information is ignored completely (ordinal comparison). + The aim of this method is to provide a fast comparison that deals with null and ignores different casing. + It is not supposed to deal with various, culture-specific habits. + Use it to compare against pure ASCII constants, like keywords etc. + + The one string. + The other string. + true if the strings are equal, false otherwise. + + + + 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. + + + + + 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. + + + + + 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 . + + + + + + 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 + + + + + + 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 + + + + + + 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. + + + + + + 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 + + + + + + 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. + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + 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. + + + + + + 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 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. + + + + + + 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 + + + + + + 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. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + 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 + + + + + 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 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + Default constructor + + + + Default constructor + + + + + + 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). + + + + + + 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. + + + + + + Adds to + + + + Helper class to expose the + through the interface. + + + + + + Constructor + + the impersonation context being wrapped + + + Constructor + + + + + + Revert the impersonation + + + + Revert the impersonation + + + + + diff --git a/lib/Log4Net2012/net40/log4net.dll b/lib/Log4Net2012/net40/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..91ed9cc85405df13ecdc253d5a69c3c43252f563 GIT binary patch literal 270336 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 z zeVB(xMl1RnBn>-au^7u_(gCrE+xwP!bmR$I))+YgDT) zTRWtgazU~Kxm+gRfmYH)UJ)ysm|U!mXR%gg8&Z_c>qM0lvT`8TvEyQEOSUWg=4uKnpu|GY8#D|(6l7dshA|K?tvzOZ%AHUqCYE1DxK8o zIK}`{WGs!K&B+Kj!;%iB`jfGYq%js_0>Ly!KuR>XcV?*miY9=r8cSiC0eM7;%CR$L zBb34{*=}cF>I0mnEU9oXQfG6Se$2UuSDWr9qqQG}oW!6QOLWTl z74_Y4&ayxf)6!TuDc=;E;-I*)7L9=9QkO|5m1}K(UjnNcbW7AsN-=|LF)2i;=kaLX zx-1fh)Sx+@=#d8Hh1wE#StcBzNuOy>A?0wUKF9d~Z`V4crEFv7~iZx@{X08)=e}?6a&6TaEEzJ!2W*);D8qyNiM-ktazWk6(b?vbm!Vut@~k+J;Goo-W~&F-pUpb3yMBOQT`j!bNIoaXM0=~S*q=8@(& zc6G8!n{9GbbL@x_bJ>LLlNu9SsE^rPxwvF2WyNL1YKGULwpVm5mNPU!Tg`bek9%C6 zFO^}e?Klu}X_4fz1nW6FGTYLY89?sUn%(9m+xsow6clP0qypX74xi7V$)npx)M^UK ze+CVMNs6on`iU&t`?lI~7+QYGq1YCtv(kcG*mSnN z$6}Ko8mSVI0hO41yQ(_37pyF8?-aZ)6UU?{A;S~HRTFt`SsH@#IP&Y5k<&7pzh4i< z7uK2%qc+wR=}+XG)i`_0*o$+vCfifg3}~qDiP6>r&qx%HdNY&sHL60kP!qE)G}X5) zvU1rI_Ds?(={|^^Xm1_WAPtt1=wfTgnuE%%5ZksSMQfC7#Ga#4K-(1p3X^Zg&I&o6 z%96J{^%u5UxF69x7qlHO+ey?n<2!6YNE%R??ndU2XsIw`i7{APhO+94XQU!bEX?Kl z)KD)d4h*vb>jkyMX&@??jLXTPZG#wPn!bhQEz?w}7LAEu2ZhYGufftIy(SBX1TmU0 z;iA1MAcZAy$nu8?;?#E7JVl~_B#)dCF)eUyKW;mTI+rW2qU?BS0?!sT%eNim)YZ1q z6r3$fNeRqUCPpgW)zZRgjG+^f=w;`&o;WlGfEqB}olZ$QM$;&sbg*5Pg*6Z`D}M-JR%;A1hSf9~R3iX$-9v&M8RqP< zKH8wO$Viunf3>4smL5#3bL(UP9{aC?C)*Z$5b4& zV~Y%vij60o)-VV~m9)p!+MjV`1+%D72C>kd28$K;O4&J`+8n>qNx)&7@Oyx2I z_GgB2=}SYo$e9xmE3mvsP<&YJ=47mL=ttK}#KJw;{uLy;B-Mh15eJQ(O{pAm)LL-D zcs4T?%T?7tOCy%hGL#hg4&Nz*st}rZJnAseI#~4@fgDD7X&F8w`p*9h$Li1&mU4DX zhxi^ZxQ9kZVwU#^>aftooSdWuCj82R3bN9xt;k54>ixEhs{sy{ph@N?2R1 zrsZ1-<9Z@T@ylr}^?Rt`N$12Q1aB{TIOz})%xJ<0Ah&KD-5@(4qqMuCDl;C-G8aYF z5E)4K=h#LcZq9U~2PZ<^DO5}ieJ<{htjx=@8@|e}*p5N}?Zd2}M;@DA8q0K`M6dwo zk`Z0l(x`?!P7~AG>U0*MRg%O2k{RG)6Rl|1C_e5*N|{Wflc4!AtIOCXR}V}|T>z7E z@hYOM$rX(#LM-{RIa+{qQyh-|M#c{j2(C&Ma#R&Y?Lo>&K8-zj43wokSEYbi4$jq< zRmTaSbt28N96ne&grS8Ktc#;94{i-oLPS#1!de1J(ulc+w(__$k&Yh)!#gyTBAkP; zG(zl-=9A&ph_rM%PByiKwr*@2QU<+$H?86w9{TK3D3kJd)@-dUo^yL`?x6Ku&K219 zn2B`8l95cW6R(t!JRO1d(&YdJYd2-XOM66(}prYiS+l zxC9dMNLEhI9cD|SA9@(a9$X92Ox5hLtgMiHLkk|>k#;;t?Szn##1LOr+M&%&#<>*@ zjoy+v9Eam<38k#6i?+1mrY4zB0Z#z_Sy5ouS1DB$58 ztfEl~;SzS@v(nLunQhi#*Cis|E-MWUahj&2Q>~b;tYymO9-tiqbbnH^B?j6uQ0vE_ ziKAJH+m}+eL6&twcjSBx?ZL5F>8(lk4P@foJuau3hA^cBZ6xL5hV4@qZ4fa|L`Y90 z$tRB-o)bC7y3~Nnff}AOTsRJD^2&oF)Lroe8o%R8vZFDcf{qt6=)UGIMbj2&^#I8Y z5(Z3FW4_07gJ*s`E0q++9L3@(rKBNw6cNoqUm|I>V3HPmNfJ_gN*V)MP|j z8Y62Zk!)X0^H0pwv026%LeYp#PD_$HLr}I#?z^_~Cg`y4uB}()iwcDfd2uG07-ows z!W!N7Gkuy!K+&`xNvcnskv*|n&ut&5R$kS9%w0P(U`bk z*GFIp&KV%OxvR^yH-{`yTT|}Uk!}H%lgQ!EnOV}z(E6+#Gci@+B(ctiEIbLOZ4JvM z+|Q?7@;nUYVdXx^7ut*+g0ftl?i{cg^o=|Q>cH(zvuu?D)vA?*sG`bRMA@U z*JRStc~E1p+98*N937}xlKv-P?^B5o7M%jF(O4%@)DK`1X$ey_y9BIJS|AaDKQgeW z#F-s#f@EX|vSc)1g@{dlY@uV4N+GcdNJtB68||6D5Qvf*pgGk@XK*-u`5efIJRg)Q zS!Qi%Crmzv)by+^Q9d{)^mTU-ZnYLerOvXdtV3aIaYzOrLoN;%h09K1T4UYN47k#j z$FPz$h?#K*qF8vFlZ!%9mSC_ZbM}!X6l&C3^aijH;UaXMIgku08|X1`o}|CK2b(!r zS@5AG&ghV~mlv@7xj`)22p{5yl$0_AC6$iSa8M>X(8XzFWDBN8q>*D!0;*3_zTeK8JabBK(Qz2h>V;H*ep`OW^5a& zQ*BGs3P!Sm!&l=ZNw1Y-6cH?}8I>gE%4%woLwU>RAdR%VlY=obNqPwBm%GCu-Lm{K zsFfgYkO^M&BOxhE0f2QhgeJ|ANev>fi3=UPvIL@hAdDTb)QF*xNlz4nXVZ2Vw=Igj zbm&mo4Kw3-GLm3gMMu%cGR#qtx;W0n#2tiV&kK^rq4-=3E;uEzITjQ(mp&UUu~;v+ zBb<{A6U}RdWfr$KGSJ**+i?CtdR`by^g;D4E!67l<|jfd};? z7HyjY%5+LvtpRKY_Mno6`mLg~JS;|nIB84iqPsEnjC%>rl?&`Z1riAX-EO2WK4W@S zCoGZ9)s98xNxAfL29+hDbix#*wz>(@-D(~Xb@JFMnoOQ-BnPSDlZ8q0l6Z2GLKJo> zl)|hf4N?ja)|+4o5$lBhkMe$XJvgkHk$d9_KjS4Ntio|Q$8FUq1?qOz&3 zschUSXaY>pCEM4KLZL0qhpB94R=V1)(mGsft=>ae(^-|{Zqj*c@I(3GRUh}VL-}y6 z>7&Bd zxlJx5Dh~UOE@lOC8%N&lC2<0s1ZHG>@QX{7#gww+=)c>_8(wY(@{I`jGb&+F0jev< zbm7<B%0~Y8Ow%Y__Fg2<6un=TuyXmCc=7uIx^*QK;7o4gHZ4^LS$WD zXtsoD8G4AD8%*})a7)L|0rfT8qFRlLnTyT&ki0NqeHOx}6Za=JW9d|1% z&3zp%3k%1JR%)FTbeM8`l}?sR`Qy0I`GG{dQ_W%0DaQqwbOeCI=8HS&H7<{|?d`Zz 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 literal 0 HcmV?d00001 diff --git a/lib/Log4Net2012/net40/log4net.xml b/lib/Log4Net2012/net40/log4net.xml new file mode 100644 index 0000000..ac8ed2c --- /dev/null +++ b/lib/Log4Net2012/net40/log4net.xml @@ -0,0 +1,32444 @@ + + + + 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 + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + 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. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + This property requires at least .NET 2.0. + + + + + 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. + + + If this property is not set, the command text is retrieved by invoking + . + + + + + + 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. + + + + + 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 + + + + Connects to the database. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + 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. + + + + + Database connection string. + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings 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 reconnect when a connection is lost. + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + 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 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 + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + 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". + + + + + + 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + 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. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Ansi code to reset terminal + + + + + 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. + + + + + + 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 + + + + + + Initialize the options for the object + + + + Combine the and together + and append the attributes. + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + 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. + + + + + 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. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the AppenderCollection. + + + + + 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. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + 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 . + + + + + 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 . + + + + + 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 + + + + Returns an enumerator that can iterate through the AppenderCollection. + + An for the entire AppenderCollection. + + + + Gets or sets the number of elements the AppenderCollection can contain. + + + + + 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 . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + 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. + + + + + + + + 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 + + + + 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 . + + + + + + 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. + + + + + + + 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. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + + The name uniquely identifies the appender. + + + + + + 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. + + + + + + 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. + + + + + Flushes any buffered log data. + + + This implementation doesn't flush anything and always returns true + + True if all logging events were flushed successfully, else false. + + + + 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 + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + 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 + (). + + + + + + 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. + + + + + + + + Defaults to %logger + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + 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 default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + 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. + + + + + 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 + + + + 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. + + + + + + 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. + + + + + 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 + + + + + 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 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 + + + + + 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. + + + + + 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". + + + + + + 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + 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 + + + + 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. + + + + + 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 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + Formats the category parameter sent to the Debug method. + + + + Defaults to a with %logger as the pattern which will use the logger name of the current + as the category parameter. + + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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 a with %logger as the pattern. + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + 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 + + + + + + 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. + + + + + + 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 + + + + Write only that uses the + to manage access to an underlying resource. + + + + + True asynchronous writes are not supported, the implementation forces a synchronous write. + + + + + 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. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + 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. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + 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 + + + + + + Releases the lock and allows others to acquire a lock. + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + 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. + + + + + + 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 . + + + + + + 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. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + 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 + + + + + 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 that can be implemented by Appenders that buffer logging data and expose a method. + + + + + Flushes any buffered log data. + + + Appenders that implement the method must do so in a thread-safe manner: it can be called concurrently with + the method. + + Typically this is done by locking on the Appender instance, e.g.: + + + + + + The parameter is only relevant for appenders that process logging events asynchronously, + such as . + + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + 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 + + + + 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 + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a local syslog service. + + + + + 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 . + + + + + 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 + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + 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 + + + + + + Appends colorful logging events to the console, using the .NET 2 + built-in capabilities. + + + + ManagedColoredConsoleAppender 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. + + + When configuring the colored console appender, mappings should be + specified to map logging levels to colors. For example: + + + + + + + + + + + + + + + + + + + + + + The Level is the standard log4net logging level while + ForeColor and BackColor are the values of + enumeration. + + + Based on the ColoredConsoleAppender + + + Rick Hobbs + Nicko Cadell + Pavlos Touboulidis + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard 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". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + 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. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + 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. + + + + + + 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. + + + + + + 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 + and clear the current list of events that have been appended. + + + Use the method to get the current + list of events that have been appended. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Use the method to clear the + current list of events. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + 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. + + + + + + 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. + + + + + + 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 + + + + + Gets the events that have been logged and clears the list of events. + + The events that have been logged + + + Gets the events that have been logged and clears 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 + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + + 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 + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Stub for OutputDebugString native method + + the string to output + + + Stub for OutputDebugString native method + + + + + + 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 + + + + Syslog port 514 + + + + + 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 + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + 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 . + + + + + 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 + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + 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. + + + + + 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 + + + + 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 + + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Cleans up all resources used by this appender. + + + + + 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! + + + + + + 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 + + + + + A mutex that is used to lock rolling of files. + + + + + The 1st of January 1970 in UTC + + + + + 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 + + + + + + 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 . + + + + + + Enable or disable use of SSL when sending e-mail message + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the reply-to e-mail address. + + + This is available on MS .NET 2.0 runtime and higher + + + + + 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. + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Send the email message + + the body text to include in the mail + + + + 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. + + + + + trims leading and trailing commas or semicolons + + + + + 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 + + + + + + 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 file extension for the generated files + + + The file extension for the generated files + + + + The file extension for the generated files + + + + + + 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. + + + + + + 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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 + + + + + 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. + + + + + 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 . + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + 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 + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + 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. + + + + + + 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. + + + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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 + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + 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. + + + + + 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. + + + + + 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 . + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + 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 + + + + 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 . + + + + + + 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. + + + + + + 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 appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + 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 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 + + + + 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 + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + Gets or sets the type of the provider to use. + + + 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. + + + + + 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 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. + + + + 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. + + + + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + 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 XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + 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 . + + + + + + + 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. + + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + 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. + + + + + 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. + + + + + 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 + + + + + + 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. + + + + + + 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. + + + + + 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 + + + + 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. + + + + + 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 . + + + + + + Notify the registered listeners that the repository has been created + + The repository that has been created + + + Raises the LoggerRepositoryCreatedEvent + event. + + + + + + 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 + + + + 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 . + + + + + + 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. + + + + + 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 + + + + 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 . + + + + 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 . + + + + + + 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 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. + + + + + + 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. + + + + + + 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 + + + + Gets the name of the logger. + + + The name of the logger. + + + + The name of this logger + + + + + + 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 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. + + + + + + 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. + + + + + + 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 + + + + + + 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 . + + + + + + 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 + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Gets the current element in the collection. + + + + + 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. + + + + + 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. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + 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. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + 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 . + + + + + 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 . + + + + + 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 + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + 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 . + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + + 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. + + + + + + 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 + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + 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 + + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + + The logger that this object is wrapping + + + + + 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 + + + + + + Gets or sets the local time the event was logged + + + + Prefer using the setter, since local time can be ambiguous. + + + + + + Gets or sets the UTC time the event was logged + + + + The TimeStamp is stored in the UTC time zone. + + + + + + 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 + + + + 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. + + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored internally in UTC and converted to 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 UTC time when the current process started. + + + This is the UTC time when this process started. + + + + 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 UTC and converted to the local time zone for this computer. + + + + + + Gets UTC the time of the logging event. + + + The UTC time of the logging event. + + + + + 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. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + 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. + + + + + + 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. + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + + provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + + returns a stack frame item from a stack frame. This + + + + + + + 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) + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + 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 time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The UTC time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 . + + + + + + 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. + + + + + 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 + + + + 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 . + + + + + + 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. + + + + + 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. + + + + + 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. + + + + + + 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 + + + + 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. + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + 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 . + + + + + + 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 . + + + + + + 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 + + + + + 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 . + + + + + + 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. + + + + + + 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 + + + + + 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 . + + + + + + 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. + + + + + + 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 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". + + + + + + 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 + + + + The key to use to lookup the string from the event properties + + + + + Default constructor + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 properties map. + + + The global properties map. + + + + The global properties map. + + + + + + The global context properties instance + + + + + 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 . + + + + + + + + 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> + + + + + + 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 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. + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + 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 +
+ + + 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. + + + + + + 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. + + + + + + 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. + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + 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 + + + + 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. + + + + + + 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. + + + + 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 + + + + 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 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. + + + + + 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. + + + + + + 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 + + + + Initializes a new instance of the class. + + + + + 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. + + + + + + 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 + + + + + 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 + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + 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. + + + + + 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. + + + + + 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 + + + + 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 + + + + + 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 . + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + + + 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. + + + + + + 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". + + + + + + 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 + + + + + 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. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + 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 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. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + 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 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. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + 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. + + + 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. + + + 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. + + + + 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. + + + + + 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. + + + + 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. + + + + Flushes logging events buffered in all configured appenders in the default repository. + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed. + True if all logging events were flushed successfully, else false. + + + + 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. + + + + + 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. + + + + + + + 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"); + } + + + + + + Pushes a new context message. + + The new context message string format. + Arguments to be passed into messageFormat. + + 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. + + var someValue = "ExampleContext" + using(log4net.NDC.PushFormat("NDC_Message {0}", someValue)) + { + 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. + + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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 + + + + Get the default renderer instance + + the default renderer + + + Get the default renderer + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + 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. + + + + + 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. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + 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. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + 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 . + + + + + 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 . + + + + + 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. + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + 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 . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + The current element in the collection. + + + + + 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. + + + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + + 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 repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + The name of this plugin. + + + + + The repository 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. + + + + + + Gets or sets the URI of this sink. + + + The URI of this sink. + + + + This is the name under which the object is marshaled. + + + + + + + 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. + + + + + 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 + + + + 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. + + + + + + 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 + + + + Event used to notify that a logger has been created. + + + + Event raised when a logger is created. + + + + + + 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 . + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + + 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. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + Gets the logger name. + + + The name of the logger. + + + + The name of this logger + + + + + + 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. + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + 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. + + + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + 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. + + + + + + Flushes all configured Appenders that implement . + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed, + or to wait indefinitely. + True if all logging events were flushed successfully, else false. + + + + 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 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. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + 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 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. + + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + 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. + + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + 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. + + + + The singleton instance of the empty dictionary. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + The static class ILogExtensions contains a set of widely used + methods that ease the interaction with the ILog interface implementations. + + + + This class contains methods for logging at different levels and checks the + properties for determining if those logging levels are enabled in the current + configuration. + + + Simple example of logging messages + + using log4net.Util; + + ILog log = LogManager.GetLogger("application-log"); + + log.InfoExt("Application Start"); + log.DebugExt("This is a debug message"); + + + + + + The fully qualified type of the Logger class. + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) 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 logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. 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. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + 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. + + The logger on which the message is logged. + 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. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + 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. + + The logger on which the message is logged. + 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. + + The logger on which the message is logged. + 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. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) 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 logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. 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. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + 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. + + The logger on which the message is logged. + 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. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + 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. + + The logger on which the message is logged. + 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. + + The logger on which the message is logged. + 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. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (retrieved by invocation of the provided callback) 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 logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. 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. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + 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. + + The logger on which the message is logged. + 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. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + 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. + + The logger on which the message is logged. + 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. + + The logger on which the message is logged. + 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. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (retrieved by invocation of the provided callback) 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 logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. 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 logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + 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. + + The logger on which the message is logged. + 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. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + 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. + + The logger on which the message is logged. + 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. + + The logger on which the message is logged. + 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. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (retrieved by invocation of the provided callback) 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 logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. 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. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + 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. + + The logger on which the message is logged. + 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. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + 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. + + The logger on which the message is logged. + 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. + + The logger on which the message is logged. + 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. + + + + + + + + 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 + + + + + + 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 + + + + + + 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 any options defined on this entry + + + + Should be overridden by any classes that need to initialise based on their options + + + + + + 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. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + 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. + + + + + + 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. + + + + + + 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. + + + + + Delegate type used for LogicalThreadContextStack's callbacks. + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + The name of this within the + . + + + + + The callback used to let the register a + new instance of a . + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + 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. + + + + + + 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 thread 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.LogicalThreadContext.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.LogicalThreadContext.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 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. + + + + + + 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 + + + + + + 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 depth to trim the stack to when this instance is disposed + + + + + The outer LogicalThreadContextStack. + + + + + 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. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + + + + + + + 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 + + + + 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. + + + + + The UTC 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. + + + + + 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. + + + + + + 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 : + + + + + + + + + + + + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + 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: ". + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + Test if LogLog.Warn is enabled for output. + + + + + + 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 ". + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + 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 . + + + + + + 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. + + + + + + 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. + + + + 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. + + + + + + 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. + + + + The singleton instance of the . + + + + + 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. + + + + + + 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. + + + + 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 . + + + + + 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. + + + + + + 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 occurred, or if it has not been triggered. + + + + + The UTC date the first error that trigged this error handler occured, or if it has not been triggered. + + + + + 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 + + + + + The UTC 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. + + + + + 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. + + + + + 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 + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + 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 + + + + + + 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 + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + 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. + + + + + + + + + + + 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. + + + + + + Get the converter registry used by this parser + + + The converter registry used by this parser + + + + Get the converter registry used by this parser + + + + + + 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 + + + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + 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. + + + + + 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. + + + + + appsetting + + + Used to output the value of a specific appSetting key in the application + configuration file. + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + + 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 . + + + + + + AppSetting pattern converter + + + + This pattern converter reads appSettings from the application configuration file. + + + If the is specified then that will be used to + lookup a single appSettings value. If no is specified + then all appSettings will be dumped as a list of key value pairs. + + + A typical use is to specify a base directory for log files, e.g. + + + + + ... + + + ]]> + + + + + + + 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. + + + + + + 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. + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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 + + + 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 + + + + + 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 + + + + + + Property Key + + + Property Key + + + + Property Key. + + + + + + Property Value + + + Property Value + + + + Property Value. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + 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. + + + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + 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. + + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + 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 + + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + The number of properties in this collection + + + + + See + + + + + See + + + + + 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 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. + + + + + + Get the UTC start time for the current process. + + + + This is the UTC 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. + + + + + + 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. + + + + + + Tests two strings for equality, the ignoring case. + + + If the platform permits, culture information is ignored completely (ordinal comparison). + The aim of this method is to provide a fast comparison that deals with null and ignores different casing. + It is not supposed to deal with various, culture-specific habits. + Use it to compare against pure ASCII constants, like keywords etc. + + The one string. + The other string. + true if the strings are equal, false otherwise. + + + + 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. + + + + + 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. + + + + + 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 . + + + + + + 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 + + + + + + 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 + + + + + + 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. + + + + + + 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 + + + + + + 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. + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + 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. + + + + + + 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 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. + + + + + + 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 + + + + + + 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. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + 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 + + + + + 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 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + Default constructor + + + + Default constructor + + + + + + 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). + + + + + + 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. + + + + + + Adds to + + + + Helper class to expose the + through the interface. + + + + + + Constructor + + the impersonation context being wrapped + + + Constructor + + + + + + Revert the impersonation + + + + Revert the impersonation + + + + + diff --git a/src/Common.Logging.Log4Net2012/AssemblyInfo.cs b/src/Common.Logging.Log4Net2012/AssemblyInfo.cs new file mode 100644 index 0000000..0d365ad --- /dev/null +++ b/src/Common.Logging.Log4Net2012/AssemblyInfo.cs @@ -0,0 +1,5 @@ +using System.Reflection; +using System.Security; + +[assembly: AssemblyProduct("Common Logging Framework log4net 2.0.12 Adapter")] +[assembly: SecurityTransparent] \ No newline at end of file diff --git a/src/Common.Logging.Log4Net2012/Common.Logging.Log4Net2012.2010-net40.csproj b/src/Common.Logging.Log4Net2012/Common.Logging.Log4Net2012.2010-net40.csproj new file mode 100644 index 0000000..a547f5a --- /dev/null +++ b/src/Common.Logging.Log4Net2012/Common.Logging.Log4Net2012.2010-net40.csproj @@ -0,0 +1,96 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {F1731675-AE3F-41AE-8DB6-4069D28F1DA0} + Library + Properties + Common + Common.Logging.Log4Net2012 + v4.0 + 512 + + + + true + full + false + ..\..\build\net40\Common.Logging.Log4Net2012\Debug\ + TRACE;DEBUG;NET_4_0 + prompt + 4 + Common.Logging.Log4Net2012.xml + false + + + pdbonly + true + ..\..\build\net40\Common.Logging.Log4Net2012\Release\ + TRACE;NET_4_0 + prompt + 4 + Common.Logging.Log4Net2012.xml + false + + + + False + ..\..\lib\Log4Net2012\net\net40\log4net.dll + + + + + + + + + + + + Logging\Log4Net\CommonLoggingAppender.cs + + + Logging\Log4Net\Log4NetGlobalVariablesContext.cs + + + Logging\Log4Net\Log4NetLogger.cs + + + Logging\Log4Net\Log4NetLoggerFactoryAdapter.cs + + + Logging\Log4Net\Log4NetNestedThreadVariablesContext.cs + + + Logging\Log4Net\Log4NetThreadVariablesContext.cs + + + CommonAssemblyInfo.cs + + + + + + + + + {7eeb2191-b3fc-4509-aa4b-a345c386eeed} + Common.Logging.Core.2010 + + + {440D903A-D409-48FC-A6C4-3EE69CCD663B} + Common.Logging.2010-net40 + + + + + \ No newline at end of file diff --git a/src/Common.Logging.Log4Net2012/Common.Logging.Log4Net2012.2010.csproj b/src/Common.Logging.Log4Net2012/Common.Logging.Log4Net2012.2010.csproj new file mode 100644 index 0000000..4f498f8 --- /dev/null +++ b/src/Common.Logging.Log4Net2012/Common.Logging.Log4Net2012.2010.csproj @@ -0,0 +1,128 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {3F5B8D80-5985-4DBA-BD0E-7ABF0F786456} + Library + Properties + Common + Common.Logging.Log4Net2012 + + + 3.5 + + + false + v2.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + true + full + false + ..\..\build\net20\Common.Logging.Log4Net2012\Debug\ + DEBUG;TRACE + prompt + 4 + Common.Logging.Log4Net2012.xml + true + 1607 + AllRules.ruleset + + + pdbonly + true + ..\..\build\net20\Common.Logging.Log4Net2012\Release\ + TRACE + prompt + 4 + Common.Logging.Log4Net2012.xml + true + 1607 + AllRules.ruleset + + + + False + ..\..\lib\Log4Net2012\net\net20\log4net.dll + + + + + + + + Logging\Log4Net\CommonLoggingAppender.cs + + + Logging\Log4Net\Log4NetGlobalVariablesContext.cs + + + Logging\Log4Net\Log4NetLogger.cs + + + Logging\Log4Net\Log4NetLoggerFactoryAdapter.cs + + + Logging\Log4Net\Log4NetNestedThreadVariablesContext.cs + + + Logging\Log4Net\Log4NetThreadVariablesContext.cs + + + CommonAssemblyInfo.cs + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + {cadfb630-279f-427c-96a9-d2f9aa718648} + Common.Logging.Core.2010-net20 + + + {440d903a-d409-48fc-a6c4-3ee69ccd663b} + Common.Logging.2010 + + + + + \ No newline at end of file diff --git a/src/Common.Logging.Log4Net2012/Common.Logging.Log4Net2012.nuspec b/src/Common.Logging.Log4Net2012/Common.Logging.Log4Net2012.nuspec new file mode 100644 index 0000000..7b8042a --- /dev/null +++ b/src/Common.Logging.Log4Net2012/Common.Logging.Log4Net2012.nuspec @@ -0,0 +1,28 @@ + + + + Common.Logging.Log4Net2012 + 0.0.0 + + Aleksandar Seovic, Mark Pollack, Erich Eichinger, Stephen Bohlen, G. Stoynev + Aleksandar Seovic, Mark Pollack, Erich Eichinger, Stephen Bohlen + http://net-commons.github.io/common-logging/ + https://raw.githubusercontent.com/net-commons/common-logging/master/nuget-graphics/common-logging-icon.png + false + Common.Logging library bindings for Log4Net 2.0.12 logging framework. + Log4Net Common.Logging.Log4Net logging log Common.Logging + en-US + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/Common.Logging.Log4Net2012.Integration.Tests/AssemblyInfo.cs b/test/Common.Logging.Log4Net2012.Integration.Tests/AssemblyInfo.cs new file mode 100644 index 0000000..438e6dc --- /dev/null +++ b/test/Common.Logging.Log4Net2012.Integration.Tests/AssemblyInfo.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] diff --git a/test/Common.Logging.Log4Net2012.Integration.Tests/Common.Logging.Log4Net2012.Tests.Integration.2010-net40.csproj b/test/Common.Logging.Log4Net2012.Integration.Tests/Common.Logging.Log4Net2012.Tests.Integration.2010-net40.csproj new file mode 100644 index 0000000..4c36d2f --- /dev/null +++ b/test/Common.Logging.Log4Net2012.Integration.Tests/Common.Logging.Log4Net2012.Tests.Integration.2010-net40.csproj @@ -0,0 +1,121 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {5B086217-D343-4BB1-8750-BF22AF66C7FD} + Library + Properties + Common + Common.Logging.Log4Net2012.Tests.Integration + + + 3.5 + + + false + v4.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + true + full + false + ..\..\build\net40\Common.Logging.Log4Net2012.Tests.Integration\Debug\ + TRACE;DEBUG;NET_4_0 + prompt + 4 + false + AllRules.ruleset + + + pdbonly + true + ..\..\build\net40\Common.Logging.Log4Net2012.Tests.Integration\Release\ + TRACE;NET_4_0 + prompt + 4 + AllRules.ruleset + + + + False + ..\..\lib\net\2.0\nunit.framework.dll + + + + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + {7eeb2191-b3fc-4509-aa4b-a345c386eeed} + Common.Logging.Core.2010 + + + {f1731675-ae3f-41ae-8db6-4069d28f1da0} + Common.Logging.Log4Net2012.2010-net40 + + + {440D903A-D409-48FC-A6C4-3EE69CCD663B} + Common.Logging.2010-net40 + + + {be30142e-a7a1-46ca-aed4-b2da5675eba3} + Common.Logging.Log4Net2012.Tests.2010-net40 + + + + + \ No newline at end of file diff --git a/test/Common.Logging.Log4Net2012.Integration.Tests/Common.Logging.Log4Net2012.Tests.Integration.2010.csproj b/test/Common.Logging.Log4Net2012.Integration.Tests/Common.Logging.Log4Net2012.Tests.Integration.2010.csproj new file mode 100644 index 0000000..ec8ff41 --- /dev/null +++ b/test/Common.Logging.Log4Net2012.Integration.Tests/Common.Logging.Log4Net2012.Tests.Integration.2010.csproj @@ -0,0 +1,117 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {E16E38CF-DA06-4933-9EC6-886071EEB9A8} + Library + Properties + Common + Common.Logging.Log4Net2012.Tests.Integration + + + 3.5 + + + false + v3.5 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + true + full + false + ..\..\build\net20\Common.Logging.Log4Net2012.Tests.Integration\Debug\ + DEBUG;TRACE + prompt + 4 + false + AllRules.ruleset + + + pdbonly + true + ..\..\build\net20\Common.Logging.Log4Net2012.Tests.Integration\Release\ + TRACE + prompt + 4 + AllRules.ruleset + + + + False + ..\..\lib\net\2.0\nunit.framework.dll + + + + + + + + + + + {cadfb630-279f-427c-96a9-d2f9aa718648} + Common.Logging.Core.2010-net20 + + + {3f5b8d80-5985-4dba-bd0e-7abf0f786456} + Common.Logging.Log4Net2012.2010 + + + {440D903A-D409-48FC-A6C4-3EE69CCD663B} + Common.Logging.2010 + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + \ No newline at end of file diff --git a/test/Common.Logging.Log4Net2012.Tests/Common.Logging.Log4Net2012.Tests.2010-net40.csproj b/test/Common.Logging.Log4Net2012.Tests/Common.Logging.Log4Net2012.Tests.2010-net40.csproj new file mode 100644 index 0000000..8047318 --- /dev/null +++ b/test/Common.Logging.Log4Net2012.Tests/Common.Logging.Log4Net2012.Tests.2010-net40.csproj @@ -0,0 +1,124 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {BE30142E-A7A1-46CA-AED4-B2DA5675EBA3} + Library + Properties + Common + Common.Logging.Log4Net2012.Tests + + + 3.5 + + + false + v4.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + true + full + false + ..\..\build\net40\Common.Logging.Log4Net2012.Tests\Debug\ + TRACE;DEBUG;NET_4_0 + prompt + 4 + AnyCPU + false + AllRules.ruleset + + + pdbonly + true + ..\..\build\net40\Common.Logging.Log4Net2012.Tests\Release\ + TRACE;NET_4_0 + prompt + 4 + AllRules.ruleset + + + + False + ..\..\lib\Log4Net2012\net\net40\log4net.dll + + + False + ..\..\lib\net\2.0\nunit.framework.dll + + + False + ..\..\lib\net\2.0\Rhino.Mocks.dll + + + + + + + + {7eeb2191-b3fc-4509-aa4b-a345c386eeed} + Common.Logging.Core.2010 + + + {f1731675-ae3f-41ae-8db6-4069d28f1da0} + Common.Logging.Log4Net2012.2010-net40 + + + {440D903A-D409-48FC-A6C4-3EE69CCD663B} + Common.Logging.2010-net40 + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + Logging\Log4Net\CommonLoggingAppenderTests.cs + + + Logging\Log4Net\Log4NetLoggerFactoryAdapterTests.cs + + + + + \ No newline at end of file diff --git a/test/Common.Logging.Log4Net2012.Tests/Common.Logging.Log4Net2012.Tests.2010.csproj b/test/Common.Logging.Log4Net2012.Tests/Common.Logging.Log4Net2012.Tests.2010.csproj new file mode 100644 index 0000000..bb8bb7e --- /dev/null +++ b/test/Common.Logging.Log4Net2012.Tests/Common.Logging.Log4Net2012.Tests.2010.csproj @@ -0,0 +1,125 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {1AE6C0BD-AC90-4EE4-AD16-56EAADE01902} + Library + Properties + Common + Common.Logging.Log4Net2012.Tests + + + 3.5 + + + false + v3.5 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + true + full + false + ..\..\build\net20\Common.Logging.Log4Net2012.Tests\Debug\ + DEBUG;TRACE + prompt + 4 + AnyCPU + false + AllRules.ruleset + + + pdbonly + true + ..\..\build\net20\Common.Logging.Log4Net2012.Tests\Release\ + TRACE + prompt + 4 + AllRules.ruleset + + + + ..\..\lib\Log4Net2012\net\net20\log4net.dll + + + False + ..\..\lib\net\2.0\nunit.framework.dll + + + False + ..\..\lib\net\2.0\Rhino.Mocks.dll + + + + + + + + Logging\Log4Net\CommonLoggingAppenderTests.cs + + + Logging\Log4Net\Log4NetLoggerFactoryAdapterTests.cs + + + + + Designer + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + {cadfb630-279f-427c-96a9-d2f9aa718648} + Common.Logging.Core.2010-net20 + + + {3f5b8d80-5985-4dba-bd0e-7abf0f786456} + Common.Logging.Log4Net2012.2010 + + + {440D903A-D409-48FC-A6C4-3EE69CCD663B} + Common.Logging.2010 + + + + + \ No newline at end of file diff --git a/test/Common.Logging.Log4Net2012.Tests/Logging/Log4Net/CommonLoggingAppenderTests_log4net.config.xml b/test/Common.Logging.Log4Net2012.Tests/Logging/Log4Net/CommonLoggingAppenderTests_log4net.config.xml new file mode 100644 index 0000000..8ca96e4 --- /dev/null +++ b/test/Common.Logging.Log4Net2012.Tests/Logging/Log4Net/CommonLoggingAppenderTests_log4net.config.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + +