Log4net 有三個主要組件:loggers,appenders 和 layouts。這三個組件一起工作使得開發者能夠根據信息類型和等級(Level)記錄信息,以及在運行時控制信息的格式化和信息的寫入位置(如控制台,文件,內存,數據庫等)。過濾器(filter)幫助這些組件,控制追加器(appender)的行為和把對象轉換成字符串的對象渲染。
日志(Loggers)等級
該規則是 log4net 的核心。它假設等級是有序的。對於標准等級,具有 DEBUG < INFO < WARN < ERROR < FATAL。
用相同的參數調用 log4net.LogManager.GetLogger 方法總是返回引用一個完全相同 logger 對象。如下所示:
ILog x = LogManager.GetLogger("wombat");
ILog y = LogManager.GetLogger("wombat");
x 和 y 完全引用一個相同的 logger 對象。
因此,有可能配置一個日志器,然后在代碼中的任何地方都可以檢索到相同的實例。在生物學上,父母總是先於它們的孩子,而 log4net 日志器可以以任何順序創建和配置。具體地說,一個“父”日志器將發現和鏈接到它的后代,即使它在它的后代之后才實例化。
log4net 環境的配置通常是在應用程序初始化。優先的方法是讀取一個配置文件。
追加器(Appenders)
已經實現的輸出方式有:
- AdoNetAppender 將日志記錄到數據庫中。可以采用SQL和存儲過程兩種方式。
- AnsiColorTerminalAppender 將日志高亮輸出到ANSI終端。
- AspNetTraceAppender 能用asp.net中Trace的方式查看記錄的日志。
- BufferingForwardingAppender 在輸出到子Appenders之前先緩存日志事件。
- ConsoleAppender 將日志輸出到應用程序控制台。
- EventLogAppender 將日志寫到Windows Event Log。
- FileAppender 將日志輸出到文件。
- ForwardingAppender 發送日志事件到子Appenders。
- LocalSyslogAppender 將日志寫到local syslog service (僅用於UNIX環境下)。
- MemoryAppender 將日志存到內存緩沖區。
- NetSendAppender 將日志輸出到Windows Messenger service.這些日志信息將在用戶終端的對話框中顯示。
- OutputDebugStringAppender 將日志輸出到Debuger,如果程序沒有Debuger,就輸出到系統Debuger。如果系統Debuger也不可用,將忽略消息。
- RemoteSyslogAppender 通過UDP網絡協議將日志寫到Remote syslog service。
- RemotingAppender 通過.NET Remoting將日志寫到遠程接收端。
- RollingFileAppender 將日志以回滾文件的形式寫到文件中。
- SmtpAppender 將日志寫到郵件中。
- SmtpPickupDirAppender 將消息以文件的方式放入一個目錄中,像IIS SMTP agent這樣的SMTP代理就可以閱讀或發送它們。
- TelnetAppender 客戶端通過Telnet來接受日志事件。
- TraceAppender 將日志寫到.NET trace 系統。
- UdpAppender 將日志以無連接UDP數據報的形式送到遠程宿主或用UdpClient的形式廣播。
AdoNetAppender:
MS SQL Server:

CREATE TABLE [dbo].[Log] ( [Id] [int] IDENTITY (1, 1) NOT NULL, [Date] [datetime] NOT NULL, [Thread] [varchar] (255) NOT NULL, [Level] [varchar] (50) NOT NULL, [Logger] [varchar] (255) NOT NULL, [Message] [varchar] (4000) NOT NULL, [Exception] [varchar] (2000) NULL )

<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> <bufferSize value="100" /> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="data source=[database server];initial catalog=[database name];integrated security=false;persist security info=True;User ID=[user];Password=[password]" /> <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" /> <parameter> <parameterName value="@log_date" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value="@thread" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@log_level" /> <dbType value="String" /> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="4000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> <parameter> <parameterName value="@exception" /> <dbType value="String" /> <size value="2000" /> <layout type="log4net.Layout.ExceptionLayout" /> </parameter> </appender>
MS Access:

<appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender"> <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\log\access.mdb;User Id=;Password=;" /> <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" /> <parameter> <parameterName value="@log_date" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date" /> </layout> </parameter> <parameter> <parameterName value="@thread" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@log_level" /> <dbType value="String" /> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="1024" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> </appender>
Oracle9i:

create table log ( Datetime timestamp(3), Thread varchar2(255), Log_Level varchar2(255), Logger varchar2(255), Message varchar2(4000) );

<appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender"> <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="data source=[mydatabase];User ID=[user];Password=[password]" /> <commandText value="INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" /> <bufferSize value="128" /> <parameter> <parameterName value=":log_date" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value=":thread" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value=":log_level" /> <dbType value="String" /> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value=":logger" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value=":message" /> <dbType value="String" /> <size value="4000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> </appender>
SQLite:

CREATE TABLE Log ( LogId INTEGER PRIMARY KEY, Date DATETIME NOT NULL, Level VARCHAR(50) NOT NULL, Logger VARCHAR(255) NOT NULL, Message TEXT DEFAULT NULL );

<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> <bufferSize value="100" /> <connectionType value="Finisar.SQLite.SQLiteConnection, SQLite.NET, Version=0.21.1869.3794, Culture=neutral, PublicKeyToken=c273bd375e695f9c" /> <connectionString value="Data Source=c:\\inetpub\\wwwroot\\logs\\log4net.db;Version=3;" /> <commandText value="INSERT INTO Log (Date, Level, Logger, Message) VALUES (@Date, @Level, @Logger, @Message)" /> <parameter> <parameterName value="@Date" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value="@Level" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@Logger" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@Message" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> </appender>
實際上,你會發現,建立數據表都是差不多的,appender配置幾乎也一致。如果我們每種數據庫的表字段都保持一致,實際上,只需要改:connectionType、connectionString、commandText
<connectionType value="Npgsql.NpgsqlConnection, Npgsql" /> <connectionString value="Server=localhost;Port=5432;Database=pp_log;User Id=postgres;Password=123;" /> <commandText value="INSERT INTO log (date,thread,level,logger,message,exception) VALUES (:log_date, :thread, :log_level,:logger, :message, :exception)" />
AspNetTraceAppender:
這段配置可將日志信息輸出到頁面的Trace上下文環境。如果日志的級別低於WARN,會以System.Web.TraceContext.Write方法輸出;如果級別為WARN或WARN以上則會以System.Web.TraceContext.Warn方法輸出,下圖中的日志信息的不同顏色可以說明這一點。 效果圖如下:
<appender name="AspNetTraceAppender" type="log4net.Appender.AspNetTraceAppender" > <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender>
BufferingForwardingAppender :
BufferingForwardingAppender的主要作用是將輸出到指定類型(這里是LogFileAppender)的Appender的日志信息進行緩存。bufferSize屬性指定了緩存的數量,如果value為5,那么將在信息量達到6條的時候,把這些日志批量輸出。appender-ref屬性指定了緩存的Appender類型,同root節點一樣,這里可以指定多個。
<appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender" > <bufferSize value="5"/> <lossy value="true" /> <evaluator type="log4net.Core.LevelEvaluator"> <threshold value="WARN"/> </evaluator> <appender-ref ref="LogFileAppender" /> <appender-ref ref="AspNetTraceAppender" /> </appender>
ColoredConsoleAppender:
ColoredConsoleAppender將日志信息輸出到控制台。默認情況下,日志信息被發送到控制台標准輸出流。下面這個示例演示了如何高亮顯示Error信息。
<!-- 控制台前台顯示日志 --> <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> <mapping> <level value="ERROR" /> <foreColor value="Red, HighIntensity" /> </mapping> <mapping> <level value="Info" /> <foreColor value="Green" /> </mapping> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%n%date{HH:mm:ss,fff} [%-5level] %m" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="Info" /> <param name="LevelMax" value="Fatal" /> </filter> </appender>
ConsoleAppender:
ConsoleAppender將日志信息輸出到控制台標准輸出流。
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <target value="Console.Error" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender>
EventLogAppender:
EventLogAppender將日志寫入本地機器的應用程序事件日志中。默認情況下,該日志的源(Source)是AppDomain.FriendlyName,也可以手動指定其它名稱。
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" > <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> </layout> </appender>
FileAppender:
FileAppender將日志信息輸出到指定的日志文件。
File指定了文件名稱,可以使用相對路徑,此時日志文件的位置取決於項目的類型(如控制台、Windows Forms、ASP.NET等);也可以使用絕對路徑;甚至可以使用環境變量,如<file value="${TMP}\log-file.txt" />。
AppendToFile指定是追加到還是覆蓋掉已有的日志文件。
還可以添加如下屬性<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />來使用最小鎖定模型(minimal locking model),以允許多個進程可以寫入同一個文件。
<appender name="LogFileAppender" type="log4net.Appender.FileAppender" > <param name="File" value="WebUtilClient.log" /> <param name="AppendToFile" value="true" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> </layout> </appender>

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <!--日志路徑--> <param name= "File" value= "D:\App_Log\Servicelog\TestLog\"/> <!--是否是向文件中追加日志--> <param name= "AppendToFile" value= "true"/> <!--log保留天數--> <param name= "MaxSizeRollBackups" value= "10"/> <!--日志文件名是否是固定不變的--> <param name= "StaticLogFileName" value= "false"/> <!--日志文件名格式為:2008-08-31.log--> <param name= "DatePattern" value= "yyyy-MM-dd".read.log""/> <!--日志根據日期滾動--> <param name= "RollingStyle" value= "Date"/> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n %loggername" /> </layout> </appender>
日志器可以采用多個追加器,在配置文件中,可以直接這樣使用:
<root> <level value="ALL" /> <appender-ref ref="ColoredConsoleAppender" /> <appender-ref ref="UdpAppender" /> </root>