<lognet>
<root>
<level value=ALL />
<appenderref ref=rollingFile />
</root>
<appender name=rollingFile type=lognetAppenderRollingFileAppenderlognet >
<param name=File value=logtxt />
<param name=AppendToFile value=false />
<param name=RollingStyle value=Date />
<param name=DatePattern value=yyyyMMdd />
<param name=StaticLogFileName value=true />
<layout type=lognetLayoutPatternLayoutlognet>
<param name=ConversionPattern value=%d [%t] %p %c %m%n />
<param name=Header value= header />
<param name=Footer value= footer />
</layout>
</appender>
<appender name=consoleApp type=lognetAppenderConsoleAppenderlognet>
<layout type=lognetLayoutPatternLayoutlognet>
<param name=ConversionPattern value=%d [%t] %p %c %m%n />
</layout>
</appender>
<logger name=LogNetTestLogTest>
<level value=DEBUG />
<appenderref ref=rollingFile />
<appenderref ref=coloredConsoleApp />
<appenderref ref=SystemEvent />
</logger>
</lognet>
lognet配置節的XSD層次如下
<lognet>
<root><level /><appenderref ref= /></root>
<appender name= type=Appender的完全限定類名>
<param name= value= />
<layout type=lognetLayoutPatternLayoutlognet>
<param name= value= />
</layout>
</appender>
<logger>
<level value= />
<appenderref ref= />
</logger>
lognet是lognet配置節的根標記
root標記定義一個根級別的記錄者lognet的記錄者采用層級組織的 每一個LOGGER(ROOT也是一個LOGGER只不過他是祖先而已別的方面跟其他LOGGER一樣)都可以定義Level
level定義記錄的日志級別就是說你要記錄哪個級別以上的日志級別由高往低依次是:
None
Fatal
ERROR
WARN
DEBUG
INFO
ALL
級別的定義要注意如果你定義DEBUG那麼低於DEBUG級別以下的信息將不會記入日志啥意思呢?就是說就算你在程序裡用()來寫入一個日志信息可是你在配置中指定level為DEBUG由於INFO級別低於DEBUG所以不會被記入日志這樣的處理非常靈活
Logger還有一個配置就是appenderref了ref是參照的意思lognet的架構非常有意思可擴展性非常高非常值得借鑒他分為四個要素:
logger
appender
layout
filter
logger是負責日志的記錄者
appender提供記錄的介質
layout負責把記入的內容格式化
filter負責把內容進行篩選
可以說整個過程就是一個日志流水線每個成員負責其中的一個環節
logger發出記錄信息appender接到信息根據內部的layout配置對記錄信息格式化根據filter決定此信息是否被過濾掉最後將其序列化
因此logger的appenderref就是定義說LOGGER要找誰去將內容寫入磁盤流或其他介質因此十分重要吧
既然是ref引用那肯定要定義這個被引用的appender對象了呀
每個appender都代表了一個輸出介質
name屬性指定其名稱type則是lognetAppender命名空間的一個類的名稱意思是指定使用哪種介質
lognet支持的appender類型有十幾種最常用的有rollingFileAppenderAdoNetAppenderEventLogAppenderFileAppender分別把日志記入文件系統日志和數據庫
除此之外appender內的其他參數都用param標記以key/value形式定義於其內
這裡有個小提示每一個appenderlognet並沒有在文檔中提出他們需要哪些參數那麼我們怎麼知道呢?
原來這些param的名稱你可以直接查對應的appender類的屬性名即可例如使用EventLogAppender時通過查看類的屬性我們知道其有
LogNameApplicationName屬性那麼意味著你可以直接在這個APPENDER的param裡加入以下內容:
<param name=LogName value=Application />
<param name=ApplicationName value=lognetTest />
定義了appender的NAME及TYPE屬性以及使用param為其指定參數後一個appender就建立了你可以使用他的名字在LOGGER的<appenderref中去 引用它那麼引用它的LOGGER在寫入日志時就是寫到了APPENDER中定義的介質中去了
一個LOGGER可以引用多個APPENDER其結果是同一個日志被同時記錄到多個介質中去 便如同時發郵件寫入系統日志發送到遠程主機不過雖然可以這樣做但是還是要小心因為會對性能有一定的影響除非你需要否則不要亂用此功能
另外appender中可以定義可選的layout
layout的定義非常有必要如果你不想將來看到你的日志會感覺頭暈的話雖然lognet幫你寫入日志但是日志信息的格式卻是我們使用者自行定義的layout的type參數指定使用哪個類的定義來格式化常用的有XmlLayoutSimpleLayoutPatternLayout這個當然要根據你的需要以及你要產生的格式來選啦如果你要輸出成XML文檔格式你肯定不能用simplelayout吧
layout使用param以KEY/VALUE形式定義其參數
各個Layout類使用的參數當然不一樣啦具體的你可以去看各個Layout類的屬性
其中PatternLayout可以使用ConversionPattern參數來指定一個格式化字符串
以及可以指定一個Header參數做為日志開頭的字符串Footer來指定結尾字符串
這裡有一個小技巧日志中開頭和結尾總想產生回車符吧雖然logger在寫入一條日志會自動回車可是Header和FOOTER卻不會咋辦?用\n\r嗎?(我從別人的BLOG上看到過)經實踐\n\r會原樣定改日志根本不會轉換其實我們可以用XML實體呀使用&#;&#;就可以在指定位置插入一個回車換行符了
最後像lognet的文檔中說的那樣如果你不想你的日志文件變得很大使讀寫的性能下降的話建議你還是分級管理日志把粒度變小點也就是說除了定義ROOT外最後對每一個模塊或每一個實體依據用途目的定義各自的LOGGER配置這樣的好處是日志被分散了日志文件增長就沒那麼快了每一個LOGGER的結構跟ROOT是一模一樣的這裡不再敘述了像前面說的那樣如果你相讓日志產生層級關系你可以跟他們的NAME屬性像C#中的namespace那樣命名就可以了
要說明的是LOGGER的定義是非必須的只是一種建議罷了Lognet的配置中除了必須定義一個ROOT和一個APPENDER外其他的都是可選的
另一種配置lognet的方法是在單獨的XML文件中配置這個時候只要把lognet標記中的內容復制過來就行了不需要configSections
From:http://tw.wingwit.com/Article/program/net/201311/11448.html