???? 日志部分在程序中占了4%,有利于幫助我們很快地得到我們需要的調(diào)試信息,找到問題的根源盡快解決問題,從而降低我們的維護成本。這幾天一直斷斷續(xù)續(xù)地學(xué)習(xí)Log4net部分,由于知道自己在一個比較長的時間必須去使用.net的部分(HA Project and LIS Project),沒辦法,只有硬著頭皮死肯:),不過也讓我見識不少呢!log4net是appache開源的一個杰作,和log4J很相象,如同孿生的兄弟一樣,基本的概念原理都是一樣的,她主要應(yīng)用在.net上的。下面是我一些收集的資料,同時也是我在開發(fā)過程中的一些經(jīng)驗總結(jié)。稍后也會把一些實際項目的經(jīng)驗記錄下來,和使用Log4J的相關(guān)內(nèi)容。
Log4net 主要有四個組件。分別是Logger(記錄器),Repository(庫),Appender(附著器)和Layout(布局)。?
Logger
定義與用途:
Logger 是應(yīng)用程序需要交互的主要組件,它用來產(chǎn)生日志消息。產(chǎn)生的日志消息并不直接顯示,還要預(yù)先經(jīng)過 Layout 的格式化處理后才會輸出。
Root
是一個默認(rèn)的
Logger
,當(dāng)一個
root
和
Logger
內(nèi)容配置一致的時候就會記錄兩條相同的記錄,當(dāng)在配置文件中找不到
logger
的名字時候,就會使用root的配置。?
?
Repository
定義與用途:
Repository
主要用于負(fù)責(zé)日志對象組織結(jié)構(gòu)的維護?,F(xiàn)在 已經(jīng)使用LogManager類來維護日志對象組織。
Appender
定義及用途:
?? 定義輸出介質(zhì),可以把多個 Aappender 附加到一個日志對象中,?一個Appender對象缺省地把所有的日志事件傳遞到輸出流中,我們可以通過Aappender Filters來過濾剩下我們需要的部分。分別有級別過濾(定義級別區(qū)間),字符串過濾,可以定義多個filter。such as :LevelMatchFilter、LevelRangeFilter、MDCFilter、NDCFilter、 StringMatchFilter.
Layout
定義與用途
Layout
組件用于向用戶顯示最后經(jīng)過格式化的輸出信息??梢允蔷€性的或一個
XML
文件。
Layout
組件和一個
Appender
組件一起工作。也就是說一個
appender
對象
只能對應(yīng)一個
layout
對象。
Log4net DEBUG
信息分級:
一共有七級
級別
允許方法
Boolean
屬性
優(yōu)先級別
OFF
(拒絕所有的日志請求)
???????????????????? FATAL???????????????????????????????????? ERROR??
? null?????????????????????????????????????????????????????????????????? ?void Fatal(...);
? null??????????????????????????????????????????????????????????????? ??? bool IsFatalEnabled;
?Highest????????????????????????????????????????????????????????????? second?????????????????????????????????????? three
?
?WARN
void Warn(...);
bool IsWarnEnabled;
four????????????????????????????????????????????????????????????????????five???????????????????????????????????????????six
?
ALL
(允許所有的日志請求)
?Null
?Null
?Lowest
Log4net
配置方式:
1.
在單獨文件里配置(推薦):改變配置不需要重新編譯代碼,同時也可以在程序運行的過程中修改代碼。
2.
在程序代碼中配置
關(guān)聯(lián)配置文件:
log4net
框架使用
log4net.Config.DOMConfiguratorAttribute
log4net.Config.XmlConfigurator
在程序集的級別上定義配置文件。方法有多種的:
1
.可以在項目的
AssemblyInfo.cs
文件里添加以下的語句
其中
configFile
設(shè)定了配置文件的文件名,路徑,擴展名
configFileExtension
設(shè)定了被編譯的文件使用擴展名字,默認(rèn)為
config
eg:
[assembly:log4net.Config.DOMConfigurator(ConfigFile="/Projects/Regular/bin/config/App.log.conf.xml",Watch=true)]?
2
.可以不帶參數(shù)應(yīng)用
DOMConfiguratio():
?[assembly: log4net.Config.DOMConfigurator()]
3.
也可以在程序代碼中用
DOMConfigurator
類打開配置文件。類的構(gòu)造函數(shù)需要一個
FileInfo
對象作參數(shù),以指出要打開的配置文件名。
log4net.Config.DOMConfigurator.Configure(
? new FileInfo("TestLogger.Exe.Config"));
創(chuàng)建日志對象:
當(dāng)日志對象沒有在配置文件中定義的話,就會使用
root
的祖父節(jié)點。
Log4net.ILog log = Log4net.LogManager.GetLogger("MyLogger");
輸出日志信息:
可以使用輸出日志的幾種方式:fatal();error();warn();info();debug();
if (log.IsDebugEnabled) log.Debug("message");
DEBUG
輸出格式的意義:
Eg
:
<param name="ConversionPattern"
?? value="%d [%t] %-5p %c [%x] - %m%n"
??????? />
%m(message):
輸出的日志消息,如
ILog.Debug(
…
)
輸出的一條消息
%n(new line):
換行
%d(datetime):
輸出當(dāng)前語句運行的時刻
%r(run time):
輸出程序從運行到執(zhí)行到當(dāng)前語句時消耗的毫秒數(shù)
%t(thread id):
當(dāng)前語句所在的線程
ID
%p(priority):
日志的當(dāng)前優(yōu)先級別,即
DEBUG
、
INFO
、
WARN
…等
%c(class):
當(dāng)前日志對象的名稱,例如:
??????
模式字符串為:
%-10c -%m%n
??????
代碼為:
ILog log=LogManager.GetLogger(“Exam.Log”);
log.Debug(“Hello”);
???
則輸出為下面的形式:
Exam.Log?????? - Hello
%L
:輸出語句所在的行號
。包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。
%F
:輸出語句所在的文件名
%-
數(shù)字:表示該項的最小長度,如果不夠,則用空格填充
例如,轉(zhuǎn)換模式為
%r [%t]%-5p %c - %m%n
的
PatternLayout
將生成類似于以下內(nèi)容的輸出:
176 [main] INFO? org.foo.Bar - Located nearest gas station.
?(未完待續(xù))