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