Log4Net使用詳解(續)


說明自從上次在2008年在博客上發表過有關log4net的用法介紹文章之后(網址:http://blog.csdn.net/zhoufoxcn/archive/2008/03/26/2220533.aspx),有不少朋友在博文下留言詢問一些細節,現在就一些比較普遍的問題做一些稍微深入的解答,希望大家滿意。
首先說明一點的是,log4net解決的問題是提供一個記錄日志的框架,它提供了向多種目標寫入的實現,比如利用log4net可以方便地將日志信息記錄到文件、控制台、Windows事件日志和數據庫(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中,一般來說我們只需要提供一個描述性的字符串,然后log4net就會自動提供有關運行時的一些信息。
Log4Net的版本仍是1.2.10(2008年我寫博文的時候也是這個版本),有.NET1.0和.NET1.1和.NET2.0版本,如果有正在使用高於.NET2.0開發的也不用擔心,可以直接引用這個類庫,像在.NET2.0中開發一樣,它的網址是:http://logging.apache.org/log4net/
關於在Web中支持的問題
在我們開發項目時都會使用到config文件,可以在config文件中配置log4net。這一點Web項目和WinForm項目都是一樣的。需要注意的是,因為在Web項目中一般以較低權限的角色來運行Web項目的,所以在使用文件型日志時要注意不要放在本項目根文件夾之外。
在config文件中的配置

要使用log4net,首先要在config文件的<configSections>節點中增加配置(如果沒有這個節點請手動增加),如下:

除此之外,還要在頂級節點<configuration>下增加<log4net>子節點。在<log4net>節點下就可以增加<appender>子節點,每個<appender>子節點代表一種記錄日志的方式(僅在這里配置了不代表啟用了)。
具體說來有如下Appender:
AdoNetAppender:利用ADO.NET記錄到數據庫的日志。
AnsiColorTerminalAppender:在ANSI 窗口終端寫下高亮度的日志事件。
AspNetTraceAppender:能用asp.net中Trace的方式查看記錄的日志。
BufferingForwardingAppender:在輸出到子Appenders之前先緩存日志事件。
ConsoleAppender:將日志輸出到控制台。
EventLogAppender:將日志寫到Windows Event Log.
FileAppender:將日志寫到文件中。
LocalSyslogAppender:將日志寫到local syslog service (僅用於UNIX環境下).
MemoryAppender:將日志存到內存緩沖區。
NetSendAppender:將日志輸出到Windows Messenger service.這些日志信息將在用戶終端的對話框中顯示。
RemoteSyslogAppender:通過UDP網絡協議將日志寫到Remote syslog service。
RemotingAppender:通過.NET Remoting將日志寫到遠程接收端。
RollingFileAppender:將日志以回滾文件的形式寫到文件中。
SmtpAppender:將日志寫到郵件中。
TraceAppender:將日志寫到.NET trace 系統。
UdpAppender:將日志connectionless UDP datagrams的形式送到遠程宿主或以UdpClient的形式廣播。
關於使用log4net中可能會使用到的一些參數
%m(message):輸出的日志消息,如ILog.Debug(…)輸出的一條消息
%n(new line):換行
%d(datetime):輸出當前語句運行的時刻
%r(run time):輸出程序從運行到執行到當前語句時消耗的毫秒數
%t(thread id):當前語句所在的線程ID
%p(priority): 日志的當前優先級別,即DEBUG、INFO、WARN…等
%c(class):當前日志對象的名稱,例如:
%f(file):輸出語句所在的文件名。
%l(line):輸出語句所在的行號。
%數字:表示該項的最小長度,如果不夠,則用空格填充,如“%-5level”表示level的最小寬度是5個字符,如果實際長度不夠5個字符則以空格填充。
下面以一個實際的例子來說明問題,比如在配置中有“%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline”,那么實際的日志中會是如下格式:
“記錄時間:2010-11-17 16:16:36,561 線程ID:[9] 日志級別:文件:所在行ERROR 出錯類:Log4NetDemo.Program property:[(null)] - 錯誤描述:error
System.Exception: 在這里發生了一個異常,Error Number:2036084948”
關於對數據庫的支持
前面已經說過,log4net是支持包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite在內的數據庫的,如果是文件型數據庫(如Access或SQLite)的話就需要指定數據庫文件的位置(在Web中最好指定在有讀寫權限的文件夾下,並且實現創建好表),如果是網絡數據庫就需要指定正確的數據庫連接字符串。
比如要記錄到Oracle數據庫中,在配置文件中可以增加一個< appender>節點,配置如下:

當然從上面的配置中的SQL語句中可以看得出這個表的參數,日志表的創建語句如下:

在本例中周公采用了將日志記錄到SQLite這個單機數據庫的方式,並且還將記錄記錄日志時的文件名和行號,創建SQLite的SQL語句如下:

增加的< appender>節點配置如下:

從上面的配置中可以看出插入數據的SQL語句及參數信息,下面的<parameter>節點就是指定插入的數據,比如我們指定SQL語句中的"@Source"參數來源於log4net中的"%file:%line"參數,也就是這兩個參數用“:”用連接起來。
控制日志文件大小的問題
對於一個長時間使用並且有大量業務日志的系統來說,如果使用FileAppender將日志一直記錄到一個文件中會引起性能低下的問題,我曾見過有個系統的日志文件達到了800多M,最后系統無法及時響應了,在這種情況下可考慮使用RollingFileAppender循環記錄日志,一種是指定文件的最大長度,如果超過了就重新生成一個文件,如下面的配置:

在上面的配置中,每個日志文件最大100KB,最大日志文件個數是10生成的日志文件名會是RollingFileAppender_log.txt.1, RollingFileAppender_log.txt.2 ... RollingFileAppender_log.txt.10,如果記錄的日志超過10個,會從RollingFileAppender_log.txt.1開始覆蓋。
還有一種方式就是按照日期記錄日志,它的配置如下:

這樣一來,每天的日志都寫入到一個文件中,當天的日志文件名為“RollingLogFileAppender_DateFormat_log.txt”,非當天的日志都會帶上當天的日期,如“RollingLogFileAppender_DateFormat_log.txt20101117”表示2010年11月17日的日志,這樣就可以很方便地區分每天的日志了,將來查找起來也相當方便。
在配置中啟用和關閉日志
在config文件中可以很方便地關閉和啟用日志,就是在<root>進行配置,如下就是一個例子:

在上面的例子中可以看出,如果想增加日志輸出目的地,增加<appender-ref>節點就是了,注意后面的ref是在config中配置的appender name,如果想要取消,刪除或者注釋掉這行就可以了。
Log4Net的使用
首先要添加config文件,在類庫項目、命令行程序及WinForm中添加的是app.config,在WebForm中添加的是web.config。
下面是一個在WinForm項目中的使用Log4Net的例子:

在WebForm中也可以使用Log4net,下面是一個在ASP.NET中使用Log4Net的例子:

可以看出它們的代碼基本沒有區別。

下面是一個在WinForm下的config文件的完整配置,該配置文件所使用的代碼就是在上面所使用到的代碼,使用LogFileAppender、ConsoleAppender、EventLogAppender、AdoNetAppender_SQLite、RollingFileAppender、RollingLogFileAppender_DateFormat方式記錄日志都在本地通過測試。完整的config文件代碼如下:

總結:

本篇主要是補充在上一篇關於Log4Net中未盡之處,並集中詳盡回答了一些朋友在該篇博文下的提問,如有未盡之處,請在本篇下留言。如有初學者碰巧路過不知config文件為何物,請看《asp.net夜話之十一:web.config詳解》,網址是:http://blog.csdn.net/zhoufoxcn/archive/2008/11/10/3265141.aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM