WinForm中log4net配置說明和使用
由於最近在WinForm專案中用到log4net便查閱了相關資料。但發現關於log4net的文章很多,但說的太簡陋了,經過實踐後現把總結一下。內容如下:
1.log4net的介紹
log4net(Log For Net)是Apache開源的應用於.Net框架的日誌記錄工具,詳細資訊參見Apache網站.它是針對Java的log4j(Log For Java的)姊妹工具.用過log4j的都知道,它功能強大,可配置性靈活,執行緒安全,對日誌的輸出管理和級別管理方便。使用log4net需要知道其中兩個比較重要的概念:logger 和 appender。前者是日誌記錄物件,後者是日誌記錄的目標載體,包括控制檯,檔案,定量大小的檔案,遠端廣播。log4net的工作原理簡單地說是這樣的:獲得一個用來記錄日誌的工具物件logger,然後為logger物件指定日誌的記錄位置。值得一提的是這一切工作都可以在應用程式的配置檔案中完成,所需程式碼量極少。
2.配置檔案說明
簡單的拿一個配置檔案來舉例說明:--後邊的文字表示註釋內容
<configuration>
<configSections> --在配置選項中加入log4net的引用
<section type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<appender >LogFile" type="log4net.Appender.RollingFileAppender,log4net" >
<param value="log.txt" /> --定義用檔案來儲存日誌,生成的檔案log.txt和應用程式生成的exe檔案在同一目錄下。
<param value="false" />
<param value="Date" />
<param value="yyyy.MM.dd" />
<param value="true" />
<layout type="log4net.Layout.PatternLayout,log4net">--定義輸出風格
<param value="%d [%t] %-5p %c - %m%n" />
<param value=" ----------------------header-------------------------- " />
<param value=" ----------------------footer-------------------------- " />
</layout>
</appender>
<appender>
--一個配置檔案可以有很多appender,一個appender節就相當於一個日誌輸出介質或方法。
</appender>
<logger >logApp"> --定義logger物件的名字為logApp,以方便在程式碼中使用,<logger>配置項可以不配置
<level value="ALL" />--定義輸出的資訊等級為所有其中包括Fatal.Error.Warn.Info.Debug
</logger>
<root>--定義日誌輸出的方式和等級
<level value="INFO" />
<appender-ref ref="LogFile" />--選擇了檔案輸出,注意粗體部分對應的名稱
</root>
</log4net>
</configuration>
3.Log4net的使用。
使用步驟:
- 在專案中新增log4net.dll的引用。
- 關聯配置檔案。
- 建立Ilog例項,便可以使用了。
說明:關聯配置檔案一般是通過在AssemblyInfo.cs檔案裡新增以下的語句
[assembly:log4net.Config.DOMConfigurator(ConfigFile="filename", ConfigFileExtension="ext",Watch=true/false)] 引數可以省略
ConfigFile:指出了我們的配置檔案的路徑及檔名,包括副檔名。可省略
ConfigFileExtension:如果我們對被編譯程式的程式集使用了不同的副檔名,那麼我們需要定義這個屬性,預設的,程式集的配置副檔名為”config”。
Watch (Boolean屬性): log4net框架用這個屬性來確定是否需要在執行時監視檔案的改變。如果這個屬性為true,那麼FileSystemWatcher將會被用來監視檔案的改變,重新命名 ,刪除等事件。
建立例項的方法:
Log4net框架定義了一個叫做LogManager的類,用來管理所有的logger物件。它有一個GetLogger()靜態方法,用我們提供的名字引數來檢索已經存在的Logger物件。如果框架裡不存在該Logger物件,它也會為我們建立一個Logger物件。如:ILog log = LogManager.GetLogger("logApp") //logApp是配置檔案中<logger>定義的name屬性值。
我們會以類(class)的型別(type)為引數來呼叫GetLogger(),以便跟蹤我們正在進行日誌記錄的類。傳遞的類(class)的型別(type)可以用typeof(Classname)方法來獲得。
如:ILog log = LogManager.GetLogger(this.GetType())//this.GetType()只限於部分地方可以這樣寫,最好用typeof(classname)。
最後就可以使用建立後的例項了。如:log.Info("執行××××方法開始"), log.Error("****")等
到此你就可以輕鬆使用log4net了,下一篇會給出一些配置資訊的詳細說明。歡迎大家提出建議。
介紹一下各配置資訊
1.Appenders
Appenders用來定義日誌的輸出方式。它還可以通過配置Filters和Layout來實現日誌的過濾和輸出格式。
它的輸出方式有:
- AdoNetAppender 將日誌記錄到資料庫中。可以採用SQL和儲存過程兩種方式。
- AnsiColorTerminalAppender 將日誌高亮輸出到ANSI終端。
- AspNetTraceAppender 能用asp.net中Trace的方式檢視記錄的日誌。
- BufferingForwardingAppender 在輸出到子Appenders之前先快取日誌事件。
- ConsoleAppender 將日誌輸出到應用程式控制臺。
- EventLogAppender 將日誌寫到Windows Event Log。
- FileAppender 將日誌輸出到檔案。
- RollingFileAppender 將日誌以回滾檔案的形式寫到檔案中。
- 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將日誌寫到遠端接收端。
- SmtpAppender 將日誌寫到郵件中。
- SmtpPickupDirAppender 將訊息以檔案的方式放入一個目錄中,像IIS SMTP agent這樣的SMTP代理就可以閱讀或傳送它們。
- TelnetAppender 客戶端通過Telnet來接受日誌事件。
- TraceAppender 將日誌寫到.NET trace 系統。
- UdpAppender 將日誌以無連線UDP資料報的形式送到遠端宿主或用UdpClient的形式廣播。
共20種,使用時主要體現在type屬性上 如 <appender type="log4net.Appender.RollingFileAppender,log4net" /> <appender type="log4net.Appender.ConsoleAppender,log4net" >。注意加粗部分。具體使用哪種方式就要看具體需求了。
2. Layouts
Layout用於控制Appender的輸出格式,可以使線性的也可以使XML。一個Appender只能有一個Layout。下面以列表的格式來給出具體的說明。
表示式 | 含義 |
---|---|
a | 等價於appdomain |
appdomain | 引發日誌事件的應用程式域的友好名稱。(我在使用中一般是可執行檔案的名字。) |
c | 等價於 logger |
C | 等價於 type |
class | 等價於 type |
d | 等價於 date |
date |
發生日誌事件的本地時間。 使用 DE>%utcdate 輸出UTC時間。date後面還可以跟一個日期格式,用大括號括起來。DE>例如:%date{HH:mm:ss,fff}或者%date{dd MMM yyyy HH:mm:ss,fff}。如果date後面什麼也不跟,將使用ISO8601 格式 。 日期格式和.Net中DateTime類的ToString方法中使用的格式是一樣。 另外log4net還有3個自己的格式Formatter。 它們是 "ABSOLUTE", "DATE"和"ISO8601"分別代表 AbsoluteTimeDateFormatter, DateTimeDateFormatter和Iso8601DateFormatter。例如: %date{ISO8601}或%date{ABSOLUTE}。 它們的效能要好於ToString。 |
exception |
異常資訊 日誌事件中必須存了一個異常物件,如果日誌事件不包含沒有異常物件,將什麼也不輸出。異常輸出完畢後會跟一個換行。一般會在輸出異常前加一個換行,並將異常放在最後。 |
F | 等價於 file |
file |
發生日誌請求的原始碼檔案的名字。 警告:只在除錯的時候有效。呼叫本地資訊會影響效能。 |
identity |
當前活動使用者的名字(Principal.Identity.Name). 警告:會影響效能。(我測試的時候%identity返回都是空的。) |
l | 等價於 location |
L | 等價於 line |
location |
引發日誌事件的方法(包括名稱空間和類名),以及所在的原始檔和行號。 警告:會影響效能。沒有pdb檔案的話,只有方法名,沒有原始檔名和行號。 |
level |
日誌事件等級 |
line |
引發日誌事件的行號 警告:會影響效能。 |
logger |
記錄日誌事件的Logger物件的名字。 可以使用精度說明符控制Logger的名字的輸出層級,預設輸出全名。 注意,精度符的控制是從右開始的。例如:logger 名為 "a.b.c", 輸出模型為 %logger{2} ,將輸出"b.c"。 |
m | 等價於 message |
M | 等價於 method |
message |
由應用程式提供給日誌事件的訊息。 |
mdc |
MDC (舊為:ThreadContext.Properties) 現在是事件屬性的一部分。 保留它是為了相容性,它等價於 property。 |
method |
發生日誌請求的方法名(只有方法名而已)。 警告:會影響效能。 |
n | 等價於 newline |
newline |
換行符 |
ndc |
NDC (nested diagnostic context) |
p | 等價於 level |
P | 等價於 property |
properties | 等價於 property |
property |
輸出事件的特殊屬性。例如: %property{user} 輸出user屬性。屬性是由loggers或appenders新增到時間中的。 有一個預設的屬性"DE>log4net:HostName"總是會有。DE> %property將輸出所以的屬性 。 (我除了知道可以用它獲得主機名外,還不知道怎麼用。) |
r | 等價於 timestamp |
t | 等價於 thread |
timestamp |
從程式啟動到事件發生所經過的毫秒數。 |
thread |
引發日誌事件的執行緒,如果沒有執行緒名就使用執行緒號。 |
type |
引發日誌請求的類的全名。. 可以使用精度控制符。例如: 類名是 "log4net.Layout.PatternLayout", 格式模型是 %type{1} 將輸出"PatternLayout"。(也是從右開始的。) 警告:會影響效能。 |
u | 等價於 identity |
username |
當前使用者的WindowsIdentity。(類似:HostName\Username) 警告:會影響效能。 |
utcdate |
發生日誌事件的UTC時間。DE>後面還可以跟一個日期格式,用大括號括起來。DE>例如:%utcdate{HH:mm:ss,fff}或者%utcdate{dd MMM yyyy HH:mm:ss,fff}。如果utcdate後面什麼也不跟,將使用ISO8601 格式 。 日期格式和.Net中DateTime類的ToString方法中使用的格式是一樣。 另外log4net還有3個自己的格式Formatter。 它們是 "ABSOLUTE", "DATE"和"ISO8601"分別代表 AbsoluteTimeDateFormatter, DateTimeDateFormatter和Iso8601DateFormatter。例如: %date{ISO8601}或%date{ABSOLUTE}。 它們的效能要好於ToString。 |
w | 等價於 username |
x | 等價於 ndc |
X | 等價於 mdc |
% |
%%輸出一個百分號 |
其它的一些配置資訊就不多說了。
總結:個人建議最好不要直接使用log4net,我們可以通過Common.Logging.dll提供介面來使用log4net。畢竟介面的靈活性要比類高。