我的log4net使用手册(转自 http://blog.csdn.net/lyjcn/archive/2009/08/11/4432833.aspx)
1. log4net簡(jiǎn)介
log4net是.Net下一個(gè)非常優(yōu)秀的開源日志記錄組件。log4net記錄日志的功能非常強(qiáng)大。它可以將日志分不同的等級(jí),以不同的格式,輸出到不同的媒介。Java平臺(tái)下,它還有一個(gè)姐妹組件——log4j。
log4net的下載地址:http://logging.apache.org/log4net/download.html
2. log4net的組成
log4net主要由五部分組成,分別為Appenders、Filters、Layouts、Loggers和Object Renders。
2.1 Appenders
Appenders用來定義日志的輸出方式。它還可以通過配置Filters和Layout來實(shí)現(xiàn)日志的過濾和輸出格式。
它的輸出方式有:
AdoNetAppender 將日志記錄到數(shù)據(jù)庫(kù)中。可以采用SQL和存儲(chǔ)過程兩種方式。
AnsiColorTerminalAppender 將日志高亮輸出到ANSI終端。
AspNetTraceAppender? 能用asp.net中Trace的方式查看記錄的日志。
BufferingForwardingAppender 在輸出到子Appenders之前先緩存日志事件。
ConsoleAppender 將日志輸出到應(yīng)用程序控制臺(tái)。
EventLogAppender 將日志寫到Windows Event Log。
FileAppender 將日志輸出到文件。
ForwardingAppender 發(fā)送日志事件到子Appenders。
LocalSyslogAppender 將日志寫到local syslog service (僅用于UNIX環(huán)境下)。
MemoryAppender 將日志存到內(nèi)存緩沖區(qū)。
NetSendAppender 將日志輸出到Windows Messenger service.這些日志信息將在用戶終端的對(duì)話框中顯示。
OutputDebugStringAppender 將日志輸出到Debuger,如果程序沒有Debuger,就輸出到系統(tǒng)Debuger。如果系統(tǒng)Debuger也不可用,將忽略消息。
RemoteSyslogAppender 通過UDP網(wǎng)絡(luò)協(xié)議將日志寫到Remote syslog service。
RemotingAppender 通過.NET Remoting將日志寫到遠(yuǎn)程接收端。
RollingFileAppender 將日志以回滾文件的形式寫到文件中。
SmtpAppender 將日志寫到郵件中。
SmtpPickupDirAppender 將消息以文件的方式放入一個(gè)目錄中,像IIS SMTP agent這樣的SMTP代理就可以閱讀或發(fā)送它們。
TelnetAppender 客戶端通過Telnet來接受日志事件。
TraceAppender 將日志寫到.NET trace 系統(tǒng)。
UdpAppender 將日志以無(wú)連接UDP數(shù)據(jù)報(bào)的形式送到遠(yuǎn)程宿主或用UdpClient的形式廣播。
2.2 Filters
使用過濾器可以過濾掉Appender輸出的內(nèi)容。過濾器有以下幾種:
DenyAllFilter 阻止所有的日志事件被記錄
LevelMatchFilter 只有指定等級(jí)的日志事件才被記錄
LevelRangeFilter 日志等級(jí)在指定范圍內(nèi)的事件才被記錄
LoggerMatchFilter Logger名稱匹配,才記錄
PropertyFilter 消息匹配指定的屬性值時(shí)才被記錄
StringMathFilter 消息匹配指定的字符串才被記錄
2.3 Layouts
Layout用于控制Appender的輸出格式,可以使線性的也可以使XML。一個(gè)Appender只能有一個(gè)Layout。
最常用的Layout應(yīng)該是用戶自定義格式的PatternLayout,其次是SimpleLayout和ExceptionLayout。然后還有4個(gè)Layout,其中有兩個(gè)是輸出Xml的Layout,但是中文會(huì)有問題。
ExceptionLayout需要給Logger的方法傳入Exception對(duì)象作為參數(shù)才起作用,否則就什么也不輸出。輸出的時(shí)候會(huì)包含Message和Trace
最后說一下PatterLayout的格式化字符串:
Conversion Pattern Name Effect
a 等價(jià)于appdomain
appdomain 引發(fā)日志事件的應(yīng)用程序域的友好名稱。(我在使用中一般是可執(zhí)行文件的名字。)
c 等價(jià)于 logger
C 等價(jià)于 type
class 等價(jià)于 type
d 等價(jià)于 date
date 發(fā)生日志事件的本地時(shí)間。 使用 %utcdate 輸出UTC時(shí)間。date后面還可以跟一個(gè)日期格式,用大括號(hào)括起來。例如:%date{HH:mm:ss,fff}或者%date{dd MMM yyyy HH:mm:ss,fff}。如果date后面什么也不跟,將使用ISO8601 格式 。
日期格式和.Net中DateTime類的ToString方法中使用的格式是一樣。
另外log4net還有3個(gè)自己的格式Formatter。 它們是 "ABSOLUTE", "DATE"和"ISO8601"分別代表 AbsoluteTimeDateFormatter, DateTimeDateFormatter和Iso8601DateFormatter。例如: %date{ISO8601}或%date{ABSOLUTE}。
它們的性能要好于ToString。
?
exception 異常信息
日志事件中必須存了一個(gè)異常對(duì)象,如果日志事件不包含沒有異常對(duì)象,將什么也不輸出。異常輸出完畢后會(huì)跟一個(gè)換行。一般會(huì)在輸出異常前加一個(gè)換行,并將異常放在最后。
?
F 等價(jià)于 file
file 發(fā)生日志請(qǐng)求的源代碼文件的名字。
警告:只在調(diào)試的時(shí)候有效。調(diào)用本地信息會(huì)影響性能。
?
identity 當(dāng)前活動(dòng)用戶的名字(Principal.Identity.Name).
警告:會(huì)影響性能。(我測(cè)試的時(shí)候%identity返回都是空的。)
?
l 等價(jià)于 location
L 等價(jià)于 line
location 引發(fā)日志事件的方法(包括命名空間和類名),以及所在的源文件和行號(hào)。
警告:會(huì)影響性能。沒有pdb文件的話,只有方法名,沒有源文件名和行號(hào)。
?
level 日志事件等級(jí)
?
line 引發(fā)日志事件的行號(hào)
警告:會(huì)影響性能。
?
logger 記錄日志事件的Logger對(duì)象的名字。
可以使用精度說明符控制Logger的名字的輸出層級(jí),默認(rèn)輸出全名。
注意,精度符的控制是從右開始的。例如:logger 名為 "a.b.c", 輸出模型為 %logger{2} ,將輸出"b.c"。
?
m 等價(jià)于 message
M 等價(jià)于 method
message 由應(yīng)用程序提供給日志事件的消息。
?
mdc MDC (舊為:ThreadContext.Properties) 現(xiàn)在是事件屬性的一部分。 保留它是為了兼容性,它等價(jià)于 property。
?
method 發(fā)生日志請(qǐng)求的方法名(只有方法名而已)。
警告:會(huì)影響性能。
?
n 等價(jià)于 newline
newline 換行符
?
ndc NDC (nested diagnostic context)
?
p 等價(jià)于 level
P 等價(jià)于 property
properties 等價(jià)于 property
property 輸出事件的特殊屬性。例如: %property{user} 輸出user屬性。屬性是由loggers或appenders添加到時(shí)間中的。 有一個(gè)默認(rèn)的屬性"log4net:HostName"總是會(huì)有。
%property將輸出所以的屬性 。
(我除了知道可以用它獲得主機(jī)名外,還不知道怎么用。)
?
r 等價(jià)于 timestamp
t 等價(jià)于 thread
timestamp 從程序啟動(dòng)到事件發(fā)生所經(jīng)過的毫秒數(shù)。
?
thread 引發(fā)日志事件的線程,如果沒有線程名就使用線程號(hào)。
?
type 引發(fā)日志請(qǐng)求的類的全名。.
可以使用精度控制符。例如: 類名是 "log4net.Layout.PatternLayout", 格式模型是 %type{1} 將輸出"PatternLayout"。(也是從右開始的。)
警告:會(huì)影響性能。
?
u 等價(jià)于 identity
username 當(dāng)前用戶的WindowsIdentity。(類似:HostName\Username)
警告:會(huì)影響性能。
?
utcdate 發(fā)生日志事件的UTC時(shí)間。后面還可以跟一個(gè)日期格式,用大括號(hào)括起來。例如:%utcdate{HH:mm:ss,fff}或者%utcdate{dd MMM yyyy HH:mm:ss,fff}。如果utcdate后面什么也不跟,將使用ISO8601 格式 。
日期格式和.Net中DateTime類的ToString方法中使用的格式是一樣。
另外log4net還有3個(gè)自己的格式Formatter。 它們是 "ABSOLUTE", "DATE"和"ISO8601"分別代表 AbsoluteTimeDateFormatter, DateTimeDateFormatter和Iso8601DateFormatter。例如: %date{ISO8601}或%date{ABSOLUTE}。
它們的性能要好于ToString。
?
w 等價(jià)于 username
x 等價(jià)于 ndc
X 等價(jià)于 mdc
% %%輸出一個(gè)百分號(hào)
?
關(guān)于調(diào)用本地信息(caller location information)的說明:
%type %file %line %method %location %class %C %F %L %l %M 都會(huì)調(diào)用本地信息。這樣做會(huì)影響性能。本地信息使用System.Diagnostics.StackTrace得到。.Net 1.0 不支持System.Diagnostics.StackTrace 類。
本地信息在調(diào)試模式下可以正常獲取,在非調(diào)試模式下可能獲取不到,或只能獲取一部分。(根據(jù)我的測(cè)試,其實(shí)是需要有一個(gè)程序數(shù)據(jù)庫(kù)(.pdb)文件。)
%property 這個(gè)東西中的屬性好像是要用代碼來設(shè)置(除了默認(rèn)屬性log4net:HostName)。
轉(zhuǎn)義字符的修飾符:
Format modifier left justify minimum width maximum width comment
%20logger false 20 none 如果logger名不足20個(gè)字符,就在左邊補(bǔ)空格。
?
%-20logger true 20 none 如果logger名不足20個(gè)字符,就在右邊補(bǔ)空格。
?
%.30logger NA none 30 超過30個(gè)字符將截?cái)唷?br />?
%20.30logger false 20 30 logger名要在20到30之間,少了在左邊補(bǔ)空格,多了截?cái)唷?br />?
%-20.30logger true 20 30 logger名要在20到30之間,少了在右邊補(bǔ)空格,多了截?cái)唷?br />?
2.4 Loggers
Logger是直接和應(yīng)用程序交互的組件。Logger只是產(chǎn)生日志,然后由它引用的Appender記錄到指定的媒介,并由Layout控制輸出格式。
Logger提供了多種方式來記錄一個(gè)日志消息,也可以有多個(gè)Logger同時(shí)存在。每個(gè)實(shí)例化的Logger對(duì)象對(duì)被log4net作為命名實(shí)體(Named Entity)來維護(hù)。log4net使用繼承體系,也就是說假如存在兩個(gè)Logger,名字分別為a.b.c和a.b。那么a.b就是a.b.c的祖先。每個(gè)Logger都繼承了它祖先的屬性。
下面說一下日志的等級(jí),它們由高到底分別為:
OFF > FATAL > ERROR > WARN > INFO > DEBUG? > ALL
其中OFF表示停用所以日志記錄,ALL表示所有日志都可以記錄。
Logger實(shí)現(xiàn)的ILog接口,ILog定義了5個(gè)方法(Debug,Inof,Warn,Error,Fatal)分別對(duì)不同的日志等級(jí)記錄日志。這5個(gè)方法還有5個(gè)重載。我們以Debug為例說明一下,其它的和它差不多。
ILog中對(duì)Debug方法的定義如下:
void Debug(object message);
void Debug(object message, Exception ex);
還有一個(gè)布爾屬性:
bool IsDebugEnabled { get; }
如果使用Debug(object message, Exception ex),則無(wú)論Layout中是否定義了%exception,默認(rèn)配置下日志都會(huì)輸出Exception。包括Exception的Message和Trace。如果使用Debug(object message),則無(wú)論如何日志是不會(huì)輸出Exception的,因?yàn)闆]有啊。
最后還要說一個(gè)LogManager類,它用來管理所應(yīng)得Logger。它的GetLogger靜態(tài)方法,可以獲得配置文件中相應(yīng)的Logger:
log4net.ILog log = log4net.LogManager.GetLogger("logger-name");
2.5 Object Renders
我對(duì)Object Renders的理解是這樣的。它將告訴logger如何把一個(gè)對(duì)象轉(zhuǎn)化為一個(gè)字符串記錄到日志里。(你可能注意到了,ILog中定義的接口接收的參數(shù)是Object,而不是String。)
例如你想把Orange對(duì)象記錄到日志中,但此時(shí)logger只會(huì)調(diào)用Orange默認(rèn)的ToString方法而已。所以要定義一個(gè)OrangeRender類實(shí)現(xiàn)log4net.ObjectRender.IObjectRender接口,然后注冊(cè)它。這時(shí)logger就會(huì)知道如何把Orange記錄到日志中了。
不過我沒有測(cè)試過,具體怎么做還是看文檔吧。
2.6 Repository
Repository主要用于日志對(duì)象組織結(jié)構(gòu)的維護(hù)。如果你不想自己擴(kuò)展log4Net的話,可以用不找它。但我還是覺得應(yīng)該提一下。
3.? 在程序中使用log4net
在使用log4net前要先做一些配置的工作。配置工作可以在配置文件中完成也可以再程序中用代碼完成。我們主要講在配置文件中如何配置log4net,因?yàn)檫@樣更方便靈活,而且還不用重新編譯代碼。至于如何使用代碼進(jìn)行配置,請(qǐng)查看文檔和后面參考中的連接。
3.1 定義配置文件
log4net的配置可以放在應(yīng)用程序的默認(rèn)配置文件中(app.config或web.config),也可以再你自己的配置文件中。
如果用Visual Studio來編輯配置文件,它對(duì)log4net的標(biāo)簽是不會(huì)智能提示和自動(dòng)補(bǔ)全的。當(dāng)然也不是不可能,看這里:
http://www.cnblogs.com/didasoft/archive/2007/07/23/log4net_xsd.html
這里要感謝Jerry同學(xué),為我們提供的xsd schema。
廢話少說,先看一個(gè)完整的配置文件的例子:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
? <configSections>
??? <section name="log4net"
???????????? type="log4net.Config.Log4NetConfigurationSectionHandler, log4net-net-1.2.10" />
? </configSections>
? <log4net>
??? <root>
????? <level value="WARN" />
????? <appender-ref ref="LogFileAppender" />
????? <appender-ref ref="ConsoleAppender" />
??? </root>
??? <logger name="testApp.Logging">
????? <level value="DEBUG"/>
??? </logger>
??? <appender name="LogFileAppender"
????????????? type="log4net.Appender.FileAppender" >
????? <param name="File" value="log-file.txt" />
????? <param name="AppendToFile" value="true" />
????? <layout type="log4net.Layout.PatternLayout">
??????? <param name="Header" value="[Header] "/>
??????? <param name="Footer" value="[Footer] "/>
??????? <param name="ConversionPattern"
?????????????? value="%d [%t] %-5p %c [%x]? - %m%n" />
????? </layout>
????? <filter type="log4net.Filter.LevelRangeFilter">
??????? <param name="LevelMin" value="DEBUG" />
??????? <param name="LevelMax" value="WARN" />
????? </filter>
??? </appender>
??? <appender name="ConsoleAppender"
????????????? type="log4net.Appender.ConsoleAppender" >
????? <layout type="log4net.Layout.PatternLayout">
??????? <param name="ConversionPattern"
?????????????? value="%d [%t] %-5p %c [%x] - %m%n" />
????? </layout>
??? </appender>
? </log4net>
</configuration>
如果log4net的配置不是放在應(yīng)用程序的配置文件里,而是在自己定義的文件里,<configSection>節(jié)點(diǎn)里的<section>節(jié)點(diǎn)是不需要的。
下面對(duì)其中的標(biāo)簽元素做一下說明。
3.1.1 <log4net>
所有的配置都要在<log4net>元素里定義。
支持的屬性:
debug 可選,取值是true或false,默認(rèn)是false。設(shè)置為true,開啟log4net的內(nèi)部調(diào)試。
update 可選,取值是Merge(合并)或Overwrite(覆蓋),默認(rèn)值是Merge。設(shè)置為Overwrite,在提交配置的時(shí)候會(huì)重置已經(jīng)配置過的庫(kù)。?
threshold 可選,取值是repository(庫(kù))中注冊(cè)的level,默認(rèn)值是ALL。
?
支持的子元素:
appender? 0或多個(gè)
logger 0或多個(gè)
renderer 0或多個(gè)
root 最多一個(gè)
param 0或多個(gè)
3.1.2 <root>
實(shí)際上就是一個(gè)根logger,所有其它logger都默認(rèn)繼承它。root元素沒有屬性。
支持的子元素:
appender-ref 0個(gè)或多個(gè),要引用的appender的名字。
level 最多一個(gè)。 只有在這個(gè)級(jí)別或之上的事件才會(huì)被記錄。
param 0個(gè)或多個(gè), 設(shè)置一些參數(shù)。
3.1.3 <logger>
支持的屬性:
name 必須的,logger的名稱
additivity 可選,取值是true或false,默認(rèn)值是true。設(shè)置為false時(shí)將阻止父logger中的appender。
支持的子元素:
appender-ref 0個(gè)或多個(gè),要引用的appender的名字。
level 最多一個(gè)。 只有在這個(gè)級(jí)別或之上的事件才會(huì)被記錄。
param 0個(gè)或多個(gè), 設(shè)置一些參數(shù)。
3.1.4 <appender>
定義日志的輸出方式,只能作為 log4net 的子元素。name屬性必須唯一,type屬性必須指定。
支持的屬性:
name 必須的,Appender對(duì)象的名稱
type 必須的,Appender對(duì)象的輸出類型
支持的子元素:
appender-ref 0個(gè)或多個(gè),允許此appender引用其他appender,并不是所以appender類型都支持。
filter 0個(gè)或多個(gè),定義此app使用的過濾器。
layout 最多一個(gè)。定義appender使用的輸出格式。
param 0個(gè)或多個(gè), 設(shè)置Appender類中對(duì)應(yīng)的屬性的值。
實(shí)際上<appender>所能包含的子元素遠(yuǎn)不止上面4個(gè)。
3.1.5 <layout>
布局,只能作為<appender>的子元素。
支持的屬性:
type 必須的,Layout的類型
支持的子元素:
param 0個(gè)或多個(gè), 設(shè)置一些參數(shù)。
3.1.6 <filter>
過濾器,只能作為<appender>的子元素。
支持的屬性:
type 必須的,Filter的類型
支持的子元素:
param 0個(gè)或多個(gè), 設(shè)置一些參數(shù)。
3.1.7 <param>
<param>元素可以是如何元素的子元素。
支持的屬性:
name 必須的,取值是父對(duì)象的參數(shù)名。
value 可選的,value和type中,必須有一個(gè)屬性被指定。value是一個(gè)能被轉(zhuǎn)化為參數(shù)值的字符串。
type 可選的,value和type中,必須有一個(gè)屬性被指定。type是一個(gè)類型名,如果type不是在log4net程序集中定義的,就需要使用全名。
支持的子元素:
param 0個(gè)或多個(gè), 設(shè)置一些參數(shù)。
3.2 使用配置文件
3.2.1 關(guān)聯(lián)配置文件
log4net默認(rèn)關(guān)聯(lián)的是應(yīng)用程序的配置文件(AppName.exe.config),可以使用程序集自定義屬性來進(jìn)行設(shè)置。下面來介紹一下這個(gè)自定義屬性:log4net.Config.XmlConifguratorAttribute。
XmlConfiguratorAttribute有3個(gè)屬性:
ConfigFile 配置文件的名字,文件路徑相對(duì)于應(yīng)用程序目錄(AppDomain.CurrentDomain.BaseDirectory)。ConfigFile屬性不能和ConfigFileExtension屬性一起使用。
ConfigFileExtension 配置文件的擴(kuò)展名,文件路徑相對(duì)于應(yīng)用程序的目錄。ConfigFileExtension屬性不能和ConfigFile屬性一起使用。
Watch 如果將Watch屬性設(shè)置為true,就會(huì)監(jiān)視配置文件。當(dāng)配置文件發(fā)生變化的時(shí)候,就會(huì)重新加載。
如果ConfigFile和ConfigFileExtension都沒有設(shè)置,則使用應(yīng)用程序的配置文件(AppName.exe.config)。
舉例:
[assembly: log4net.config.XmlConfigurator(Watch=true)]??
//監(jiān)視默認(rèn)的配置文件,AppName.exe.config??
?
[assembly: log4net.config.XmlConfigurator(ConfigFileExtension="log4net",Watch=true)]??
//監(jiān)視配置文件,AppName.exe.log4net??
?
[assembly: log4net.config.XmlConfigurator(ConfigFile="log4net.config")]??
//使用配置文件log4net.config,不監(jiān)視改變。?
[assembly: log4net.config.XmlConfigurator(Watch=true)]
//監(jiān)視默認(rèn)的配置文件,AppName.exe.config
[assembly: log4net.config.XmlConfigurator(ConfigFileExtension="log4net",Watch=true)]
//監(jiān)視配置文件,AppName.exe.log4net
[assembly: log4net.config.XmlConfigurator(ConfigFile="log4net.config")]
//使用配置文件log4net.config,不監(jiān)視改變。
3.2.2 獲取日志對(duì)象
log4net.ILog logger = log4net.LogManager.GetLogger("LoggerName");
LogManager還有其他多個(gè)方法,比如檢查指定日志是否存在,返回所以日志對(duì)象等等。
特別的,如果日志名在配置文件中不存在,GetLogger方法會(huì)創(chuàng)建一個(gè)日志對(duì)象,它會(huì)繼承它的父類的屬性。例如"x.y.z"會(huì)繼承"x.y"的屬性,如果沒有"x.y"就繼承"x"的屬性,如果連"x"也沒有,會(huì)繼承root的屬性。
3.2.3 使用日志對(duì)象
獲取日志對(duì)象后,使用它是很簡(jiǎn)單的,只要調(diào)用對(duì)應(yīng)的Debug, Info等方法就可以了。不過有一件事要說一下,我們以Debug為例。
if (log.isDebugEnabled)? {log.Debug(...)}
文檔上是這么說的“如果Debug功能不被使用,就不會(huì)有參數(shù)構(gòu)造上的開銷。但是,另一方面,如果logger的Debug功能被起用,就會(huì)有倆倍的開銷用于評(píng)估logger是否被起用:一次是判斷debugEnabled,一次是判斷debug是否被啟用。但這不是極重的負(fù)擔(dān),因?yàn)樵u(píng)估logger的時(shí)間只有整個(gè)log語(yǔ)句執(zhí)行時(shí)間的1%。”
也就是說Debug方法會(huì)先判斷Debug是否啟用,再記錄日志。使用isDebugEnabled,是否會(huì)帶來性能提升,是要看情況的。
3.3 一些配置的例子
配置文件的結(jié)構(gòu)可以參照3.1節(jié),這里只給出部分元素的使用實(shí)例。
3.3.1 <filter>
1) 日志等級(jí)過濾器
<filter type="log4net.Filter.LevelRangeFilter">
??? <param name="levelMin" value="WARN" />
??? <param name="levelMax" value="FATAL" />
</filter>
其中,日志等級(jí)WARN,FATAL必須大寫。
2) 字符串過濾器
<filter type="log4net.Filter.StringMatchFilter">
??? <param name="StringToMatch" value="Warn"/>
</filter>
<filter type="log4net.Filter.StringMatchFilter">
??? <param name="StringToMatch" value="Error"/>
??? <param name="AcceptOnMatch" value="true"/>
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
上面的例子,只輸出日志信息中包含字符串"Warn"或"Error"的才輸出。最后的DenyAllFilter會(huì)阻止所有的日志信息。
過濾器還有一個(gè)AcceptOnMatch屬性,默認(rèn)為true,表示匹配的時(shí)候提交日志事件。設(shè)置成false的時(shí)候,不同類型的過濾器是不一樣的。StringMatchFilter會(huì)不提交日志事件,造成匹配的日志信息不被輸出。
StringMatchFilter還有一個(gè)RegexToMatch屬性,用來設(shè)置正則表達(dá)式。
3.3.2 <appender>
1) AdoNetAppender 將日志寫入到Sql Server數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)表的Create語(yǔ)句:
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">
??? <param name="bufferSize" value="100" />
??? <param name="connectionType" value="System.Data.SqlClient.SqlConnection" />
??? <param name="connectionString" value="data source=DatabaseServer;initial catalog=DatabaseName;integrated security=false;persist security info=True;User ID=user;Password=password" />
??? <param name="commandText" value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
??? <param name="parameter" type="log4net.Appender.AdoNetAppenderParameter">
??????? <param name="parameterName" value="@log_date" />
??????? <param name="dbType" value="DateTime" />
??????? <param name="layout" type="log4net.Layout.RawTimeStampLayout" />
??? </param>
??? <param name="parameter" type="log4net.Appender.AdoNetAppenderParameter">
??????? <param name="parameterName" value="@thread" />
??????? <param name="dbType" value="String" />
??????? <param name="size" value="255" />
??????? <param name="layout" type="log4net.Layout.PatternLayout">
??????????? <param name="conversionPattern" value="%thread" />
??????? </param>
??? </param>
??? <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>
我經(jīng)過測(cè)試,使用<param>元素,和<parameter>元素都可以,還可以混合使用。對(duì)于<parameter>等元素,log4net的文檔上并沒有說,但文檔的例子中卻在用。我個(gè)人感覺很多類屬性都可以做標(biāo)簽用,并不限于文檔中說的那幾個(gè)。
上面只是Sql Server的配置,其他數(shù)據(jù)庫(kù)見文檔:http://logging.apache.org/log4net/release/config-examples.html
2) Console 輸出到控制臺(tái)
<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>
target默認(rèn)是輸出到標(biāo)準(zhǔn)輸出流的(Console.out),這里輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出流(Console.Error)。
3) ColoredConsoleAppender 高亮輸出到控制臺(tái)
<appender name="ColoredConsole" type="log4net.Appender.ColoredConsoleAppender">
??? <mapping>
??????? <level value="ERROR" />
??????? <foreColor value="White" />
??????? <backColor value="Red, HighIntensity" />
??? </mapping>
??? <layout type="log4net.Layout.PatternLayout">
??????? <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
??? </layout>
</appender>
上例中,高于等于ERROR的日志都會(huì)用指定的前景色和背景色顯示。也可以有多個(gè)<mapping>
4) FileAppender 輸出到文件
<appender name="FileAppender" type="log4net.Appender.FileAppender">
??? <param name="File" value="${Tmp}\log.txt"
??? <param name="AppendToFile" value="false"/>
??? <param name="Encoding" value="GB2312" />
??? <param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
??? <layout type="log4net.Layout.PatternLayout">
??????? <param name="Header" type="log4net.Util.PatternString" value="[%date]%newline"/>
??????? <param name="Footer" value="-------------------------------------------------- "/>
??????? <param name="ConversionPattern" value="logger: %.30logger Message:%message %newline"/>
??? </layout>
</appender>
上面是一個(gè)復(fù)雜的FileAppender,其實(shí)除了File屬性,其他的屬性都是可選的。這個(gè)屬性值可以使用系統(tǒng)的環(huán)境變量,上面就用到了系統(tǒng)的臨時(shí)文件夾${Tmp}。也可以像layout的Header屬性那樣使用轉(zhuǎn)義字符串,像這樣:
<param name="file" type="log4net.Util.PatternString" value="%date{HHmmss} - log.txt"/>
注意文件名要符合操作系統(tǒng)的命名規(guī)范。
layout的Footer屬性,因?yàn)闆]有將type設(shè)置為PatternString,所以不能使用轉(zhuǎn)義字符串。所以要想換行就只有用xml實(shí)體了, 表示換行回車\n\r。layout的Header和Footer在很多Appender中是沒有用的,比如ConsoleAppender和AdoAppender。
FileAppender的AppendToFile表示日志寫入文件的方式是追加還是覆蓋,默認(rèn)是true,追加。Encoding用來設(shè)置文件編碼,不知道問什么我測(cè)試的時(shí)候,好像不起作用。lockingModel沒搞懂,大概是多進(jìn)程操做同一個(gè)日志文件的時(shí)候用的吧。
5) RollingFileAppender 輸出到可滾動(dòng)的文件
RollingFileAppender繼承自FileAppender,FileAppender的屬性,它都可以用。一個(gè)簡(jiǎn)單的例子:
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
??? <file value="log.txt" />
??? <appendToFile value="true" />
??? <rollingStyle value="Size" />
??? <maxSizeRollBackups value="10" />
??? <maximumFileSize value="100KB" />
??? <staticLogFileName value="true" />
??? <layout type="log4net.Layout.PatternLayout">
??????? <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
??? </layout>
</appender>
上例中,如果log.txt的文件大小超過100KB,就會(huì)把log.txt做備份,備份文件名為log.txt.1,log.txt.2……。但是備份文件的最大數(shù)是10個(gè)。
本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/lyjcn/archive/2009/08/11/4432833.aspx
轉(zhuǎn)載于:https://www.cnblogs.com/30763402/archive/2010/06/25/1764971.html
總結(jié)
以上是生活随笔為你收集整理的我的log4net使用手册(转自 http://blog.csdn.net/lyjcn/archive/2009/08/11/4432833.aspx)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Thread.Join()方法的理解
- 下一篇: JSP学习笔记(一百一十七):Windo