Log4net 日志使用介紹
802
概述
Log4net 有三個主要組件:loggers,appenders 和 layouts。這三個組件一起工作使得開發者能夠根據信息類型和等級(Level)記錄信息,以及在運行時控制信息的格式化和信息的寫入位置(如控制台,文件,內存,數據庫等)。過濾器(filter)幫助這些組件,控制追加器(appender)的行為和把對象轉換成字符串的對象渲染。
如果對log4net的基本使用並不是很清楚,可以參考我的另一遍介紹:Log4net入門使用
日志(Loggers)
日志請求是通過調用一個日志實例的打印方法(log4net.ILog)完成。這些打印方法是 Debug、Info、Warn、Error 和 Fatal。
根據定義,打印方法決定日志請求的等級。例如,如果 log 是一個日志器的實例,那么,語句 log.Info("..") 是等級為 INFO 的日志請求。
如果它的等級大於等於它日志器的等級,那么日志請求就被認為已啟用。否則,請求被認為禁用。沒有分配等級的日志器將從層次上繼承。規則如下:
Basic Selection Rule
A log request of level L in a logger with (either assigned or inherited, whichever is appropriate) level K, is enabled if L >= K.
該規則是 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
將日志記錄到數據庫中。詳情參考 log4net.Appender. AdoNetAppender SDK文檔。
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配置:
<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
建立數據表同“MS SQL Server”
appender配置:
<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配置:
<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配置:
<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
postgres
<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)" />
IBM DB2
<connectionType value="IBM.Data.DB2.DB2Connection,IBM.Data.DB2, Version=8.1.2.1" /> <connectionString value="server=192.168.0.0;database=dbuser;user Id=username;password=password;persist security info=true" /> <commandText value="INSERT INTO myschema.Log (Date,Thread,Level,Logger,Message,Exception) VALUES (@log_date,@thread,@log_level,@logger,@message,@exception)" />
AspNetTraceAppender
詳情參考 log4net.Appender.AspNetTraceAppender SDK 文檔。
這段配置可將日志信息輸出到頁面的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
詳情參考 log4net.Appender.BufferingForwardingAppender SDK 文檔。
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
詳情參考log4net.Appender.ColoredConsoleAppender SDK 文檔。
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
詳情參考 log4net.Appender.ConsoleAppender SDK 文檔。
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
詳情參考 log4net.Appender.EventLogAppender SDK 文檔。
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
詳情參考 log4net.Appender.File Appender SDK 文檔。
FileAppender將日志信息輸出到指定的日志文件。
<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>
File指定了文件名稱,可以使用相對路徑,此時日志文件的位置取決於項目的類型(如控制台、Windows Forms、ASP.NET等);也可以使用絕對路徑;甚至可以使用環境變量,如<file value="${TMP}\log-file.txt" />。
AppendToFile指定是追加到還是覆蓋掉已有的日志文件。
還可以添加如下屬性<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />來使用最小鎖定模型(minimal locking model),以允許多個進程可以寫入同一個文件。
ForwardingAppender
詳情參考 log4net.Appender.ForwardingAppender SDK 文檔。
ForwardingAppender可以用來為一個Appender指定一組約束。看下面這個示例:
<appender name="ForwardingAppender" type="log4net.Appender.ForwardingAppender" > <threshold value="WARN"/> <appender-ref ref="ConsoleAppender" /> </appender>
在這個示例中,為ConsoleAppender添加了約束,Threshold為WARN。這意味着對於一條日志信息,如果直接使用ConsoleAppender,那么不論它是什么級別,總會進行輸出,而如果使用這個ForwardingAppender,則只有那些WARN或WARN以上的日志才會發送到ConsoleAppender。
MemoryAppender
詳情參考 log4net.Appender.MemoryAppender SDK 文檔。
似乎不應該使用配置文件來配置MemoryAppender,但如果你非要這么做,看看這個示例(未驗證):
<appender name="MemoryAppender" type="log4net.Appender.MemoryAppender"> <onlyFixPartialEventData value="true" /> </appender>
NetSendAppender
詳情參考 log4net.Appender.NetSendAppender SDK 文檔。
NetSendAppender向特定用戶的屏幕發送消息(未驗證)。
<appender name="NetSendAppender" type="log4net.Appender.NetSendAppender"> <threshold value="ERROR" /> <server value="Anders" /> <recipient value="xym" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender>
OutputDebugStringAppender
詳情參考 log4net.Appender.OutputDebugStringAppender SDK 文檔。
下面這個例子描述了如何配置該Appender以向OutputDebugString API寫入日志(未驗證)。
<appender name="OutputDebugStringAppender" type="log4net.Appender.OutputDebugStringAppender" > <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender>
RemotingAppender
詳情參考 log4net.Appender.RemotingAppender SDK 文檔。
RemotingAppender向特定的Sink發送日志信息(未驗證):
<appender name="RemotingAppender" type="log4net.Appender.RemotingAppender" > <sink value="tcp://localhost:8085/LoggingSink" /> <lossy value="false" /> <bufferSize value="95" /> <onlyFixPartialEventData value="true" /> </appender>
RollingFileAppender
詳情參考 log4net.Appender.RollingFileAppender SDK 文檔。
RollingFileAppender以FileAppender為基礎,與后者有着相同的配置選項。
下面這個例子演示了如何配置RollingFileAppender以寫入log.txt文件。寫入的文件名總是為log.txt(StaticLogFileName參數指定為true);根據文件大小(RollingStyle)來生成新的文件;最多保存有10個文件(MaxSizeRollBackups屬性,而且一旦寫滿10個文件,就不再寫入日志了),每個文件最大為10KB。這些文件名稱為log.txt.1, log.txt.2…等。
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="log\Log.txt" /> <param name="AppendToFile" value="true" /> <param name="MaxSizeRollBackups" value="10" /> <param name="MaximumFileSize" value="5MB" /> <param name="RollingStyle" value="Size" /> <param name="StaticLogFileName" 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>
SmtpAppender 詳情
詳情參考 log4net.Appender.SmtpAppender SDK 文檔
SmtpAppender通過Smtp郵件服務器發送日志信息:
<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender"> <authentication value="Basic" /> <to value="anderscui@tom.com" /> <from value="anderscui@163.com" /> <username value="anderscui" /> <password value="password" /> <subject value="test logging message" /> <smtpHost value="smtp.163.com" /> <bufferSize value="512" /> <lossy value="true" /> <evaluator type="log4net.Core.LevelEvaluator"> <threshold value="WARN"/> </evaluator> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" /> </layout> </appender>
將其中的to、from、username、password、subject、smtpHost配置正確才可能發送成功。bufferSize可將多條信息打包在一個郵件中,上面配置了512,指的是將512條日記一起打包后發送。evaluator可以對日志進行過濾。
SmtpPickupDirAppender
詳情參考 log4net.Appender.SmtpPickupDirAppender SDK 文檔。
配置與SmtpAppender類似,但要把SmtpHost換為PickupDir(未驗證)。
<appender name="SmtpPickupDirAppender" type="log4net.Appender.SmtpPickupDirAppender"> <to value="to@domain.com" /> <from value="from@domain.com" /> <subject value="test logging message" /> <pickupDir value="C:\SmtpPickup" /> <bufferSize value="512" /> <lossy value="true" /> <evaluator type="log4net.Core.LevelEvaluator"> <threshold value="WARN"/> </evaluator> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" /> </layout> </appender>
TraceAppender
詳情參考 log4net.Appender.TraceAppender SDK 文檔。
TraceAppender將日志信息寫入System.Diagnostics.Trace系統(出現在輸出窗口)。
<appender name="TraceAppender" type="log4net.Appender.TraceAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender>
UdpAppender
詳情參考 log4net.Appender.UdpAppender SDK 文檔。
下例演示了如何配置UdpAppender(未驗證):
<appender name="UdpAppender" type="log4net.Appender.UdpAppender"> <localPort value="8080" /> <remoteAddress value="224.0.0.1" /> <remotePort value="8080" /> <layout type="log4net.Layout.PatternLayout, log4net"> <conversionPattern value="%-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender>
日志器可以采用多個追加器,在配置文件中,可以直接這樣使用:
<root> <level value="ALL" /> <appender-ref ref="ColoredConsoleAppender" /> <appender-ref ref="UdpAppender" /> </root>
上面分別使用了“輸出控制台”及“UdpAppender”追加方式。
篩選(Filters)
追加器可以篩選被傳遞給它們的事件。在配置中指定過濾器,允許更好地控制通過不同的追加器記錄的事件。
控制的最簡單形式是在追加器中指定閾值。
更復雜的和自定義事件過濾可以使用每個追加器中定義的過濾器鏈來完成。過濾器必須實現 log4net.Filter.IFilter 接口。
下表列出 log4net 中定義的過濾器:
類型 | 描述 |
log4net.Filter.DenyAllFilter | 丟棄所有日志事件。 |
log4net.Filter.LevelMatchFilter | 准確匹配事件等級。 |
log4net.Filter.LevelRangeFilter | 匹配一個范圍的等級。 |
log4net.Filter.LoggerMatchFilter | 匹配一個日志器名字的開始。 |
log4net.Filter.PropertyFilter | 匹配指定屬性名稱的子字符串。 |
log4net.Filter.StringMatchFilter | 匹配事件消息的子字符串。 |
過濾器可以被配置為根據匹配接受或拒絕事件。
布局(Layouts)
很多時候,用戶不僅希望自定義輸出目的地,還要定義輸出格式。這是通過與追加器相關的布局(layout)來實現的。布局負責根據用戶意願格式化日志請求,而一個追加器負責發送已格式化的輸出到目的地。 PatternLayout,是標准的 log4net 的一部分,讓用戶根據轉換模式指定數據格式,類似於 C 語言 printf。
例如,帶轉換模式的 PatternLayout "%timestamp [%thread] %-5level %logger - %message%newline" 將會輸出:
176 [main] INFO Com.Foo.Bar - Located nearest gas station.
第一個域是流逝毫秒時間;第二個域是日志請求的線程;第三個域日志語句等級,如 INFO、WARN、ERROR 等;第四個域是與日志請求相關的日志器的名稱。“-”后面的文本是具體消息。
下表是 log4net 中定義的布局:
類型 |
描述 |
Renders the exception text from the logging event. |
|
Formats the logging event according to a flexible set of formatting flags. |
|
Extracts the timestamp from the logging event. |
|
Extracts the timestamp from the logging event in Universal Time. |
|
Formats the logging event very simply: [level] - [message] |
|
Formats the logging event as an XML element. |
|
Formats the logging event as an XML element that complies with the log4j event dtd. |
由於PatternLayout布局非常重要,下面具體再介紹:
下表是可以識別的轉換模式名稱:
轉換模式名稱 |
效果 |
a |
等價於 appdomain |
appdomain |
用於輸出當產生日志事件時的 AppDomain 名稱。 |
aspnet-cache |
指定 %aspnet-cache 時輸出所有 cache 項;指定 %aspnet-cache{key} 時只輸出 key 指定的項。 該模式對 Compact Framework or Client Profile 不可用。 |
aspnet-context |
指定 %aspnet-context 時輸出所有 context 項;指定 %aspnet-context 時只輸出 key 指定的項。 該模式對 Compact Framework or Client Profile 不可用。 |
aspnet-request |
指定 %aspnet-request 時輸出所有請求參數的項;指定 %aspnet-request{key} 時只輸出 key 指定的項。 該模式對 Compact Framework or Client Profile 不可用。 |
aspnet-session |
指定 %aspnet-session 時輸出所有 session 項;指定 %aspnet-session{key} 時只輸出 key 指定的項。 該模式對 Compact Framework or Client Profile 不可用。 |
c |
等價於 logger |
C |
等價於 type |
class |
等價於 type |
d |
等價於 date |
date |
以 local time zone 輸出日志事件的日期。若輸出 universal time 日期要使用 推薦使用 log4net 日期格式化器,能得到更好的輸出。通過指定字符串“ABSOLUTE”,“DATE”和“ISO8601”中的一個,分別表示AbsoluteTimeDateFormatter, DateTimeDateFormatter 和 Iso8601DateFormatter。例如,%date{ISO8601} 或%date{ABSOLUTE}。 這寫專用的日期格式化要比 ToString 更好。 |
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 |
等價於 file |
file |
輸出發生日志請求的文件名。 警告:產生調用位置信息相當慢。除非執行速度不是問題,否則要避免使用它。 See the note below on the availability of caller location information. |
identity |
輸出當前活躍用戶的用戶名(Principal.Identity.Name)。 警告:產生調用位置信息相當慢。除非執行速度不是問題,否則要避免使用它。 |
l |
等價於 location |
L |
等價於 line |
location |
Used to output location information of the caller which generated the logging event. 位置信息(location information)依賴 CLI 的實現,但通常是由調用方法的完整限定名(fully qualified name)組成,后面跟調用者源文件名和行號。 位置信息很有用。然而,它的產生相當慢。除非執行速度不是問題,否則要避免使用。 See the note below on the availability of caller location information. |
level |
輸出日志事件的級別。 |
line |
輸出發生日志請求時的行號。 警告:產生調用位置信息相當慢。除非執行速度不是問題,否則要避免使用它。 See the note below on the availability of caller location information. |
logger |
輸出日志事件的日志器。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. 例如,若日志器名為 "a.b.c",模式為 %logger{2},將輸出 "b.c". |
m |
等價於 message |
M |
等價於 method |
message |
輸出與日志事件相關聯的應用程序提供的信息,也就是你敲入的信息。 |
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 |
輸出發生日志請求時的方法名。 警告:產生調用位置信息相當慢。除非執行速度不是問題,否則要避免使用它。 See the note below on the availability of caller location information. |
n |
等價於 newline |
newline |
輸出換行。換行是平台依賴的,各個平台可能不同。 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 |
輸出與生產日志事件線程有關的 NDC(nested diagnostic context)。 |
p |
等價於 level |
P |
等價於 property |
properties |
等價於 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 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.
|
r |
等價於 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 |
等價於 thread |
timestamp |
Used to output the number of milliseconds elapsed since the start of the application until the creation of the logging event. |
thread |
輸出產生日志事件的線程名稱。如果沒有可用的線程名稱,則使用數字。 |
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". 警告:產生調用位置信息相當慢。除非執行速度不是問題,否則要避免使用它。 See the note below on the availability of caller location information. |
u |
等價於 identity |
username |
輸出當前活躍用戶的 WindowsIdentity。 警告:產生調用位置信息相當慢。除非執行速度不是問題,否則要避免使用它。 |
utcdate |
Used to output the date of the logging event in universal time. The date conversion specifier may be followed by adate 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 (Iso8601DateFormatter). The date format specifier admits the same syntax as the time pattern string of the ToString. 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 AbsoluteTimeDateFormatter,DateTimeDateFormatter and respectively Iso8601DateFormatter. For example, %utcdate{ISO8601} or%utcdate{ABSOLUTE}. These dedicated date formatters perform significantly better than ToString. |
w |
等價於 username |
x |
等價於 ndc |
X |
等價於 mdc |
% |
連續兩個百分號 %% 會輸出一個百分號。 |
格式修飾符 |
左邊對齊 |
最小寬度 |
最大寬度 |
備注 |
%20logger |
false |
20 |
無 |
若日志器的名稱小於 20 個字符,則左邊補空格。 |
%-20logger |
true |
20 |
無 |
若日志器的名稱小於 20 個字符,則右邊補空格。 |
%.30logger |
NA |
無 |
30 |
若日志器的名稱大於 30 個字符,則截取。 |
%20.30logger |
false |
20 |
30 |
若日志器的名稱小於 20 個字符,則左邊補空格。但是,若日志器名稱的長度大於 30 個字符,則截取。 |
%-20.30logger |
true |
20 |
30 |
若日志器的名稱小於 20 個字符,則右邊補空格。但是,若日志器名稱的長度大於 30 個字符,則截取。 |
相對應的XML格式如下:
<parameter> <parameterName value="AppDomain"/> <dbType value="String"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%appdomain"/> </layout> </parameter> <parameter> <parameterName value="AspnetCache"/> <dbType value="String"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%aspnet-cache"/> </layout> </parameter> <parameter> <parameterName value="AspnetContext"/> <dbType value="String"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%aspnet-context"/> </layout> </parameter> <parameter> <parameterName value="AspnetRequest"/> <dbType value="String"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%aspnet-request"/> </layout> </parameter> <parameter> <parameterName value="AspnetSession"/> <dbType value="String"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%aspnet-session"/> </layout> </parameter> <parameter> <parameterName value="Logger"/> <dbType value="String"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger"/> </layout> </parameter> <parameter> <parameterName value="Date"/> <dbType value="DateTime"/> <layout type="log4net.Layout.RawTimeStampLayout"/> </parameter> <parameter> <parameterName value="Identity"/> <dbType value="String"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%identity"/> </layout> </parameter> <parameter> <parameterName value="Level"/> <dbType value="String"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level"/> </layout> </parameter> <parameter> <parameterName value="Location"/> <dbType value="String"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%location"/> </layout> </parameter> <parameter> <parameterName value="Exception"/> <dbType value="String"/> <layout type="log4net.Layout.ExceptionLayout"> </layout> </parameter> <parameter> <parameterName value="Message"/> <dbType value="String"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message"/> </layout> </parameter> <parameter> <parameterName value="Thread"/> <dbType value="String"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread"/> </layout> </parameter> <parameter> <parameterName value="NDC"/> <dbType value="String"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%ndc"/> </layout> </parameter> <parameter> <parameterName value="StackTraceDetail"/> <dbType value="String"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%stacktracedetail{10}"/> </layout> </parameter> <parameter> <parameterName value="UserName"/> <dbType value="String"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%username"/> </layout> </parameter> <parameter> <parameterName value="UTCDate"/> <dbType value="DateTime"/> <layout type="log4net.Layout.RawUtcTimeStampLayout"/> </parameter> </appender>
對象渲染(Object Renderers)
同樣重要的是,log4net 會根據用戶指定的標准呈現日志消息的內容。例如,如果你經常需要記錄 Oranges,它是你項目中使用的一個對象類型,那么,你可以注冊一個 OrangeRenderer,這樣無論何時需要記錄 Orange 就可以調用。
對象渲染按照類的層次結構。例如,假設橙子是水果,如果你注冊一個 FruitRenderer,所有的水果,包括橙子,將按 FruitRenderer 渲染,除非你已經注冊一個橙子的 OrangeRenderer。
對象渲染器必須實現 log4net.ObjectRenderer.IObjectRenderer 接口。
注意,DebugFormat、InfoFormat、WarnFormat、ErrorFormat 和 FatalFormat 方法不使用 ObjectRenderers。
使用部分心得
1、在輸出到數據庫里,一些數據庫相關的DLL還是需要引用的。比如:輸出到postgres 數據庫,運行時當前目錄下要有Npgsql.dll。
2、如果日志量非常的大,將數據直接輸出到文本或者是數據庫里,都會導致一個問題:減慢應用程序。如果太詳細,它可能會導致滾動失敗,插入數據庫失敗,導致整個運用程序掛掉。為了解決這個問題,我的解決方案是:
通過使用UdpAppender模式,將日志傳輸到指定的IP地址和端口下,日志監控中心進行監控操作,將接收到的日志進行分析,存入數據庫里。
UdpAppender:
<?xml version="1.0"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <appender name="UdpAppender" type="log4net.Appender.UdpAppender"> <remoteAddress value="192.168.100.107" /> <remotePort value="8080" /> <layout type="log4net.Layout.PatternLayout" value="%-5level$$%logger$$%message$$%username$$%date{yyyyMMdd HH:mm:ss fff}$$" /> </appender> <root> <level value="ALL" /> <appender-ref ref="ColoredConsoleAppender" /> <appender-ref ref="UdpAppender" /> </root> <logger name="*"> <level value="ALL" /> <appender-ref ref="UdpAppender" /> </logger> </log4net> </configuration>
配置了"%-5level$$%logger$$%message$$%username$$%date{yyyyMMdd HH:mm:ss fff}$$",以$$分隔。
監控日志中心:
using System; using System.Net; using System.Net.Sockets; namespace UdpAppender { class Program { static void Main(string[] args) { IPAddress address = IPAddress.Parse("192.168.100.107"); IPEndPoint remoteEndPoint = new IPEndPoint(address, 0); UdpClient udpClient; byte[] buffer; string loggingEvent; try { udpClient = new UdpClient(8080); while (true) { buffer = udpClient.Receive(ref remoteEndPoint); loggingEvent = System.Text.Encoding.Default.GetString(buffer); Console.WriteLine(loggingEvent); } } catch (Exception e) { Console.WriteLine(e.ToString()); } } } }
監控得到的數據效果:
這樣,就成功的將應用程序的壓力,轉移到日志監控中心了。當然,我們還可以使用現成的第三方日志分析服務器,將日志監控中心里的日志,中轉處理后,交給第三方日志分析服務器處理。
原文地址:http://logging.apache.org/log4net/release/config-examples.html
參考:
http://www.cnblogs.com/anderslly/archive/2007/03/09/log4netconfigsamples.html