From 73c8fecdf26ee704bb58f3b6ad4a3379d7cfbe4b Mon Sep 17 00:00:00 2001 From: Marek Frniak Date: Thu, 10 Sep 2026 17:52:22 +0200 Subject: [PATCH] : Version to 3.9.3146.102 in AssemblyInfo files --- .../AppDiagnostic.Logging.AssemblyInfo.cs | 2 +- ...iagnostic.Logging.AssemblyInfoInputs.cache | 2 +- ...tic.Logging.csproj.AssemblyReference.cache | Bin 2616 -> 6197 bytes GenesisCordonelInterface/bin/Debug/Common.dll | Bin 0 -> 71168 bytes GenesisCordonelInterface/bin/Debug/Common.pdb | Bin 0 -> 142848 bytes ...ware.Interfaces.Protocols.ProtocolCore.dll | Bin 0 -> 7680 bytes ...ware.Interfaces.Protocols.ProtocolCore.pdb | Bin 0 -> 22016 bytes .../Xylem.Common.Metrology.Measurements.dll | Bin 0 -> 16384 bytes .../Xylem.Common.Metrology.Measurements.pdb | Bin 0 -> 46592 bytes .../Xylem.Common.Metrology.Measurements.xml | 832 + .../bin/Debug/log4net.dll | Bin 0 -> 270336 bytes .../bin/Debug/log4net.xml | 32450 ++++++++++++++++ .../net472/SharedComponents.GlobalUsings.g.cs | 12 +- TBF/Properties/AssemblyInfo.cs | 4 +- 14 files changed, 33292 insertions(+), 10 deletions(-) create mode 100644 GenesisCordonelInterface/bin/Debug/Common.dll create mode 100644 GenesisCordonelInterface/bin/Debug/Common.pdb create mode 100644 GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.Interfaces.Protocols.ProtocolCore.dll create mode 100644 GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.Interfaces.Protocols.ProtocolCore.pdb create mode 100644 GenesisCordonelInterface/bin/Debug/Xylem.Common.Metrology.Measurements.dll create mode 100644 GenesisCordonelInterface/bin/Debug/Xylem.Common.Metrology.Measurements.pdb create mode 100644 GenesisCordonelInterface/bin/Debug/Xylem.Common.Metrology.Measurements.xml create mode 100644 GenesisCordonelInterface/bin/Debug/log4net.dll create mode 100644 GenesisCordonelInterface/bin/Debug/log4net.xml diff --git a/AppDiagnostic.Logging/obj/Debug/net472/AppDiagnostic.Logging.AssemblyInfo.cs b/AppDiagnostic.Logging/obj/Debug/net472/AppDiagnostic.Logging.AssemblyInfo.cs index a84dbdace..d8bf95e08 100644 --- a/AppDiagnostic.Logging/obj/Debug/net472/AppDiagnostic.Logging.AssemblyInfo.cs +++ b/AppDiagnostic.Logging/obj/Debug/net472/AppDiagnostic.Logging.AssemblyInfo.cs @@ -14,7 +14,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("AppDiagnostic.Logging")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1c6f9af2bb6c7dd588e6f0dab0a2836e409c1f93")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+8c77df207addcf9ed024240630cb0c32c1fde253")] [assembly: System.Reflection.AssemblyProductAttribute("AppDiagnostic.Logging")] [assembly: System.Reflection.AssemblyTitleAttribute("AppDiagnostic.Logging")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/AppDiagnostic.Logging/obj/Debug/net472/AppDiagnostic.Logging.AssemblyInfoInputs.cache b/AppDiagnostic.Logging/obj/Debug/net472/AppDiagnostic.Logging.AssemblyInfoInputs.cache index af44c1565..226b27b48 100644 --- a/AppDiagnostic.Logging/obj/Debug/net472/AppDiagnostic.Logging.AssemblyInfoInputs.cache +++ b/AppDiagnostic.Logging/obj/Debug/net472/AppDiagnostic.Logging.AssemblyInfoInputs.cache @@ -1 +1 @@ -328a35425ad6c5261737a98c855c6d7f7d872650a791c2ad21ac4020a96108d0 +310753f2dd2c5b12720ac2b377209bbf1d64c37a00b3b643b72c1104163a0fd7 diff --git a/AppDiagnostic.Logging/obj/Debug/net472/AppDiagnostic.Logging.csproj.AssemblyReference.cache b/AppDiagnostic.Logging/obj/Debug/net472/AppDiagnostic.Logging.csproj.AssemblyReference.cache index 6aed440a2eea17441594ee6876cf7603606a8a7e..bdcce23b00d2bd5ba7f341db2414c501773730db 100644 GIT binary patch delta 713 zcma)4OD_aL5Z>;ck(ourW4$@Jh=jp`;NoB<*6UzI+%}WhM#oI=ng{mcadko+T>XJf zBq9-sxcLRd$$zoc>A@Z(=FsV`uj;GstD47-hl$IhJW16)qSuZlQ3`xs6pkglaw9&( zj{ECg#JfxqJNpty9um2#T*I)j3>k9?Vk0+{B7_Xsl`vwyWwYRryKJpgWS*555etOl zg>Yt!4NktyY*nY%r%(o#G}~)A?(B+E7;zU0j z9LqlNwtcT|7B{2-=jl#L^rQ@p|LLs`u$dbNJgU?iLVcrJ0W_^QVO6WtQBeQYXFt4} zV^B4k;MvH_(T{2sN{Cc|o4D65ls#FJh4F?gl+9WEA7uWDev)vjRsBO4PFhxf=% NZ@;yU_r->{^cN6~&UOF* delta 65 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 P65RCspTGZhCGh_MZ&hKD literal 0 HcmV?d00001 diff --git a/GenesisCordonelInterface/bin/Debug/Common.pdb b/GenesisCordonelInterface/bin/Debug/Common.pdb new file mode 100644 index 0000000000000000000000000000000000000000..604c8694c99134ee222e434291d0384f9cc7de87 GIT binary patch literal 142848 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�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 kxhJI)Tn?N84Ohlq7B&96})>Jv5<7YWmIG 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 P%Wscezq923!~_2gWaevI literal 0 HcmV?d00001 diff --git a/GenesisCordonelInterface/bin/Debug/Xylem.Common.Metrology.Measurements.pdb b/GenesisCordonelInterface/bin/Debug/Xylem.Common.Metrology.Measurements.pdb new file mode 100644 index 0000000000000000000000000000000000000000..f68ab146bc0b77199d072c3d61d0cce4b9c2dca2 GIT binary patch literal 46592 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 bs01_#R0_HfbfUoeh=;fb;vV>Fdf@*6xNpW; literal 0 HcmV?d00001 diff --git a/GenesisCordonelInterface/bin/Debug/Xylem.Common.Metrology.Measurements.xml b/GenesisCordonelInterface/bin/Debug/Xylem.Common.Metrology.Measurements.xml new file mode 100644 index 000000000..263935d64 --- /dev/null +++ b/GenesisCordonelInterface/bin/Debug/Xylem.Common.Metrology.Measurements.xml @@ -0,0 +1,832 @@ + + + + Xylem.Common.Metrology.Measurements + + + + +

+ Holds all stuff for calibration of a Genesis Meter + + + + + Record at the start of the measurement + + + + + Record at the end of the measurement + + + + + Backup of intermediate record + + + + + Backup of intermediate record for short term result + This can be used to observe a result (e.g. flow rate) + between two intermediate records. The update time is + set in the ctor by intermediateUpdateTimeS. + + + + + Intermediate record for ongoing measurement + + + + + + + + Holds the accumulated overflow volume, will work only if + is being called cyclically. + The overflow will take place due to the fixed point number format or the + display resolution setting. + + + + + Holds the accumulated overflow time, will work only if + is being called cyclically. + The overflow takes place due to the fixed point number format. + + + + + Logger for debug output of measurement + + + + + Physical slot of the device + + + + + Identification of the channel + + + + + + State machine for one measurement (on one meter and one channel) + + + - add State-machine for better handling + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Set flag for starting Calibration. + The next record is going to set the start values. + + + + + + + + + Holds all stuff for calibration of a Genesis Meter + + + + + Calibration default value used to reset meter calibration + + + + + relative value (e.g. 0.05) + + + + + Setup the required tolerance in percent for check (e.g. 5 = +/-5%) + + + + + Check the tolerance of the calibration factor (e.g. 0.95 to 1.05 at 0.05 tolerance) + + + true if the calibration factor is inside the tolerance + + + + + Remind the calibration factor for the register write access + + + FlowTestRecord or CalibrationRecord + Update time needed for overflow detection in seconds + + + + + Calculate calibration factor from reference volume and reference time if set. + The deviation can adjust the factor to a required offset, it may be useful not to calibrate to 0.0). + The Result is NOT being stored to the meter. + CAN BE USED FOR STATIC START/STOP AND FLYING START/STOP PROCEDURE + + reference volume in m³ + reference time in seconds + the deviation to set the calibration in % + calibration factor as relative value or null if calibration factor cannot be calculated + + - The scale factor for calibration is going to adjusted here to keep the measurement result accurate. + + + + + information about measurement results to identify on input depending results + + + + + everything is good + + + + + inconsistent channel assignment + + + + + DUT time zero + + + + + DUT time is invalid + + + + + over flow time is invalid + + + + + REF time zero + + + + + REF time is invalid + + + + + DUT volume zero + + + + + REF volume is unknown + + + + + holds the current state for genesis actions (e.g. calibration,measurement) + + + + + If Measurement/Calibration/Action is not started + + + + + Measurement/Calibration/Action waits for next record package and sore this as start record, + After this Measurement/Calibration/Action IsRunning + + + + + Measurement/Calibration/Action collecting record and wait for end call + + + + + Measurement/Calibration/Action collecting next record record + + + + + Measurement/Calibration/Action waits for next record package and sore this as end record, + After this Measurement/Calibration/Action IsCompleted + + + + + Measurement/Calibration/Action has start and end record and can calculate a result + + + + + ProcessState nearly linear + + + + + meter not initialized + + + + + meter currently in initialization + + + + + initialization done + + + + + meter is on measurement + + + + + Measurement is done (not equal to succeed) + + + + + Meter is prepared for calibration + + + + + meter is on calibration + + + + + need Q from reference meter for calculation + + + + + Calibration is calculated + + + + + Calibration is stored on meter + + + + + SI Units + + + + + Unit definitions based on SI or derived SI or NON SI + + + + + Value without any attachable unit [] + + + + + Normalized to +/- 1.000 [norm] + + + + + Percent [%] + + + + + Voltage in Volts [V] + + + + + Current in Amperes [A] + + + + + Electrical Power in Watts [W] + + + + + Electrical Load in Ampere hours [Ah] + + + + + Distance in Meters [m] + + + + + Flow rate in cubic-meters per hour [m³/h] + + + + + Temperature in degree Celsius [°C] + + + + + Time in seconds [s] + + + + + Pressure in Pascal [Pa] + + + + + Frequency in Hertz [Hz] + + + + + Combine SI unit names with string value + + + + + Hard coded return string from FM2014 + + + + + SI unit string + + + + + Ctor + + + + + + + Table of SI and NON-SI units + + + + + Get the information string + + + Unit string + + - Initial. + + + + + + Collection of measurement interfaces + + + + + Event for new action of measurement state + + + + + Get the Type of the measurement record + + + + + + Get the channel no. the measurement collecting record for + + returns 0 when all channels should be collected + + + + Actual state of the measurement + + + + + Actual state of the measurement + + + + + Clear start, intermediate and end record and set action state to idle + + + + + Adding measurement record to processing FIFO + + + + + + Returns the actual state of the ongoing measurement + + + + + + Fist clear all record from earlier calibrations. + Set flag for starting measurement. + The next record is going to set the start values. + + + + + Stop grabbing record from streaming. + Last Data package is count as end volume (and time) + + + + + Returning the results of the ongoing measurement between two updates. + This can be used to update the screen during measurements like actual flow rate. + The timing will be set by the IntermediateUpdateTimeS. + + + + + + + + Returning the intermediate results of the ongoing measurement from the start of measurement until now! + + + + + + + + Returning the results of the measurements from start until stop. + + Measurement duration is needed explicit for flying start/stop procedure + reference volume is ALWAYS needed for scale and deviation + + + + + Sets a marker that a mesaurment start looking for an intermediate record + + + + + + interface for all incoming streaming protocol + to simplify measurements + + + + + Get volume of the record + + + + + Get time stamp of the record from meter + + + + + Get Data + + + + + + Get the channel the record comes from + + returns 0 if the channel is unavailable for this type of record (e.g. protocol f) + + + + Get overflow volume + + + + + + get overflow time + + + + + + + struct to hold a measurement record + + + + + physical channel 1, 2 and 3 + + + + + actual volume in cubic meters + + + + + Forward volume in cubic meters + + + + + Reverse volume in cubic meters as negative value + + + + + Flow rate in cubic meters per hour + + + + + Overflow volume + + + + + time converted to seconds + + + + + Overflow time + + + + + CRC16 CCITT + + + + + record is valid + + + + + Mark package as start, end, intermediate or not sync + + + + + time when package was decoded + + + + + time when package was received + + + + + + + + + + + + + + + + + + + + + + + + + + Calculate the measurements based on time, start- and stop-volume and overflow. + + + + + + + + Channel being needed for later analysis of channel number + as feedback to the caller + + + + + Accumulated overflow volume in cubic-meters, + the DUT internal range can overflow due to + the limitation of the number or the display resolution. + + + + + Accumulated overflow time in seconds, + the number-range can cause an timer overflow. + + + + + DUT start record + + + + + DUT end record + + + + + Volume = (End Volume + overflow) - Start Volume in cubic meters, + real DUT measurement uncorrected + + + + + DUT measurement corrected if REF time is given + + + + + REF volume in cubic meters + + + + + Time = (End time + overflow) - Start time in seconds, + real DUT measurement uncorrected + + + + + REF time in seconds + + + + + Flow rate in cubic meters per hour based on DUT + + + + + Flow rate in cubic meters per hour based on REF + + + + + Scale factor between REF volume and DUT volume + this will use the + /// + + + + Deviation between DUT volume and REF volume relative, + this will use the + + + + + Deviation between DUT volume and REF volume in percent, + this will use the + + + + + Calculation of measurement results, overflow will be taken into account: + - DutVolumeCm in cubic meters: + DUT volume measurement uncorrected, direct measurement from the DUT, + - CorrectedDutVolumeCm in cubic meters: + equals the uncorrected DutVolumeCm if REF time is unknown, + else it is the volume calculated from the DUT flow-rate with the REF time, + - DutTimeS in seconds: + DUT time measurement, + - DutFlowRateCmPh in cubic meters per hour: + based on DUT volume and DUT time uncorrected, + - RefFlowRateCmPh in cubic meters per hour: + REF volume and REF time being used, + - ScaleFactorRefToDut unit less: + calculated with absolute and corrected DUT volume and REF volume + needed for calibration, is higher than one if DUT volume is less than the REF volume, + can be directly used to calculate the new scale by multiplication with the current scale, + - DeviationDutToRefRel unit less: + calculated with absolute and corrected DUT volume and REF volume + deviation needed for verification relative of DUT to REF, + - DeviationDutToRefPer in percent: + calculated with absolute and corrected DUT volume and REF volume + deviation needed for verification of DUT to REF in percent. + + + - Scale factor calculation added, + - Deviation calculation added. + + + - Flow rate calculation added, + - Slot added. + + + - RefVolumeCm, RefTimeSS and absVolumeQm added, + - Slot removed. + + + - FlowRateQmPh split to DutFlowRateCmPh and RefFlowRateCmPh, + - CorrectedDutVolumeCm added, + - input channel compared with start and end record channels. + + + - State implemented. + + + - Check and states for DUT time zero, DUT volume zero, over flow volume below zero, + start and end record time below zero. + + + - Supported static start/stop with DUT- and REF-volume, this is time independent but the + DUT- and over-flow-times shouldn't be negative or zero. + - Meter renamed to DUT (Device under Test). + + Start of measurement record set + End of measurement record set + accumulated overflow volume, will add to result volume + accumulated overflow time, will add to result time + measured REF time + REF volume + physical channel of measurement path (0 for main measurement) + + + diff --git a/GenesisCordonelInterface/bin/Debug/log4net.dll b/GenesisCordonelInterface/bin/Debug/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..8646b6fcdb6be58bbdeea38c7f9680f4d153ae64 GIT binary patch literal 270336 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 z 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%0ACn!5r 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 literal 0 HcmV?d00001 diff --git a/GenesisCordonelInterface/bin/Debug/log4net.xml b/GenesisCordonelInterface/bin/Debug/log4net.xml new file mode 100644 index 000000000..dee43d645 --- /dev/null +++ b/GenesisCordonelInterface/bin/Debug/log4net.xml @@ -0,0 +1,32450 @@ + + + + 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. + + + + + + Prepare entire database command object to be executed. + + The command to prepare. + + + + 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 . + + + + + + 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: + + + + + + + + + + + + + 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. + + + + + + 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 + + + + 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 + + + + Format + + + + + Args + + + + + 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/SharedComponents/obj/Debug/net472/SharedComponents.GlobalUsings.g.cs b/SharedComponents/obj/Debug/net472/SharedComponents.GlobalUsings.g.cs index c11666bec..67703d41c 100644 --- a/SharedComponents/obj/Debug/net472/SharedComponents.GlobalUsings.g.cs +++ b/SharedComponents/obj/Debug/net472/SharedComponents.GlobalUsings.g.cs @@ -1,7 +1,7 @@ // -global using global::System; -global using global::System.Collections.Generic; -global using global::System.IO; -global using global::System.Linq; -global using global::System.Threading; -global using global::System.Threading.Tasks; +global using System; +global using System.Collections.Generic; +global using System.IO; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/TBF/Properties/AssemblyInfo.cs b/TBF/Properties/AssemblyInfo.cs index b8a3f75e1..05265d58d 100644 --- a/TBF/Properties/AssemblyInfo.cs +++ b/TBF/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("3.9.3146.101")] -[assembly: AssemblyFileVersion("3.9.3146.101")] +[assembly: AssemblyVersion("3.9.3146.102")] +[assembly: AssemblyFileVersion("3.9.3146.102")]