NLog文章系列——入門教程(下)
作者:Jaros?aw Kowalski <jaak@jkowalski.net>
翻譯:Dflying Chen:http://dflying.cnblogs.com/
原文:http://www.nlog-project.org/tutorial.html
本文為《NLog文章系列》的第四篇,即入門教程的最后一篇。將繼續描述演示用NLog書寫日志的方法。
自動重新配置
NLog的配置文件將在程序啟動之后自動加載。對于某些將長時間運行的進程(例如Windows服務或ASP.NET應用程)來說,往往需要在程序運行當中臨時性地提高記錄等級,而這時我們卻并不希望重新啟動該應用程序。NLog可以自動跟蹤其配置文件的變化,一旦配置文件被修改,NLog將立即自動重新加載。我們可以通過在配置文件中設置<nlog autoReload="true" />來實現該需求。這種自動重新配置功能也會應用到被包含的文件上,也就是說若包含文件發生了變化,NLog同樣將自動重新加載整個的配置文件。
日志功能排錯
雖然已經配置好了NLog,可是有些時候應用程序仍舊會出現一些難以理解的問題,例如沒有任何日志輸出。其中最常見的原因就是ASP.NET的權限——ASP.NET的aspnet_wp.exe或w3wp.exe可能沒有對NLog配置文件中指定目錄的寫入權限。NLog對于其自身運行中發生的異常有著很強的監測能力。如下設定可以將這些監測結果輸出至指定位置,或是對這些異常進行相應的處理(默認設定將忽略自身異常):
- <nlog throwExceptions="true" />- 當NLog自身擲出異常時,該選項可以將異常擲回日志的調用者。在開發過程中,這個設定將變得非常有用,能夠迅速幫助我們定位異常的位置以及原因。而當程序開發結束并部署到應用環境時,應該盡快設定throwExceptions為false,免得NLog自身的異常導致整個應用程序的崩潰。
- <nlog internalLogFile="file.txt" />- 讓NLog將自身運行過程中的日志信息(包括可能出現的異常)寫入到文件中。
- <nlog internalLogLevel="Trace|Debug|Info|Warn|Error|Fatal" /> - 選擇寫入內部日志的記錄等級。該等級設定的越高,相應的輸出日志文件將越小。
- <nlog internalLogToConsole="false|true" /> - 將內部日志信息發送至控制臺。
- <nlog internalLogToConsoleError="false|true" /> - 將內部日志信息發送至標準異常輸出(stderr)。
異步處理、包裝器(Warpper)以及復合輸出目標
NLog的包裝器和復合輸出目標特性讓我們能夠修改輸出目標的默認行為,這種修改體現在如下幾個方面:
- 異步處理(向目標輸出將用單獨的線程處理)
- 異常時自動重試
- 負載平衡
- 緩存
- 過濾
- 備用輸出目標(主輸出目標失敗時啟用備用輸出目標)
- 其他,請參考http://www.nlog-project.org/targets.html
只要在配置文件中將若干個target節點嵌套起來,即可完成對包裝器或復合輸出目標的定義。嵌套深度沒有任何限制。例如為某個輸出目標添加異步處理以及異常自動重試功能,只要按照如下代碼配置NLog即可:
<targets>
<target name="n" xsi:type="AsyncWrapper">
<target xsi:type="RetryingWrapper">
<target xsi:type="File" fileName="${file}.txt"/>
</target>
</target>
</targets>
異步處理特性極為常用,因此NLog提供了一種簡寫方式——即<targets async="true" />,這樣該輸出目標將自動應用AsyncWrapper包裝器。
以編程方式進行配置
某些情況下我們可能不愿用配置文件來配置NLog,而是選擇使用NLog的配置API進行。對這些API的詳細介紹已經超過了本文的范圍,所以我們這里僅僅簡單介紹一些。若希望以編程的方式對NLog進行配置,我們需要:
- 創建一個LoggingConfiguration對象,用來保存配置信息
- 至少創建一個輸出目標對象
- 設置該輸出目標對象的屬性
- 設置LoggingRule對象,并將其添加到LoggingConfiguration對象的LoggingRules集合中
- 啟用該LoggingConfiguration對象(將LogManager.Configuration設定為該LoggingConfiguration對象即可)
下面的代碼片段以編程方式創建了兩個輸出目標對象——支持顏色的控制臺和文件,并將記錄等級等于或高于Debug的日志信息發送至這兩個輸出目標:
using NLog;
using NLog.Targets;
using NLog.Config;
using NLog.Win32.Targets;
class Example
{
static void Main(string[] args)
{
// Step 1. Create configuration object
LoggingConfiguration config = new LoggingConfiguration();
// Step 2. Create targets and add them to the configuration
ColoredConsoleTarget consoleTarget = new ColoredConsoleTarget();
config.AddTarget("console", consoleTarget);
FileTarget fileTarget = new FileTarget();
config.AddTarget("file", fileTarget);
// Step 3. Set target properties
consoleTarget.Layout = "${date:format=HH\\:MM\\:ss} ${logger} ${message}";
fileTarget.FileName = "${basedir}/file.txt";
fileTarget.Layout = "${message}";
// Step 4. Define rules
LoggingRule rule1 = new LoggingRule("*", LogLevel.Debug, consoleTarget);
config.LoggingRules.Add(rule1);
LoggingRule rule2 = new LoggingRule("*", LogLevel.Debug, fileTarget);
config.LoggingRules.Add(rule2);
// Step 5. Activate the configuration
LogManager.Configuration = config;
// Example usage
Logger logger = LogManager.GetLogger("Example");
logger.Trace("trace log message");
logger.Debug("debug log message");
logger.Info("info log message");
logger.Warn("warn log message");
logger.Error("error log message");
logger.Fatal("fatal log message");
}
}
NLog還能干點兒啥?
NLog supports some more logging scenarios, which couldn't be fully described here. See the links below for more information:
除此之外,NLog還支持一些更加復雜的需要日志記錄的場景。限于篇幅,這里無法一一列出,若你對其感興趣,可以參考如下鏈接:
- 異常日志記錄 - http://sourceforge.net/mailarchive/forum.php?thread_id=6766833&forum_id=41984
- 條件表達式語言 - http://www.nlog-project.org/conditions.html
- NLogViewer - 實時的日志記錄查看器(當前還在pre-alpha階段)- http://viewer.nlog-project.org/
Last updated: 2006-07-10 11:32:55
譯注and后記
CrazyCoder朋友將加入到NLog文檔的翻譯過程中,他目前已經完成了對NLog配置文件這一節的翻譯,不日即將發布。我非常感謝CrazyCoder的無私奉獻精神!
由于某些原因,這一段時間我又會忙起來了…………可能不會如這一個月一樣這樣頻繁地更新這個Blog,當然對于留言,我仍會盡量及時答復的。十分感謝朋友們一貫的支持!
雖然很不情愿,但是很有可能這個《NLog文章系列》也沒辦法繼續寫下去了……我真的非常希望有熱心的朋友可以參與進來,既可以幫助開源社區的發展,也可以學習到新的知識,與朋友們進行交流,更能夠順便提高自己的英文能力。
如果你愿意奉獻出自己的一點點時間,參與《NLog文章系列》的翻譯,煩請你和我聯系。參與翻譯之后,如果你有能力且愿意的話,我也十分愿意盡自己微薄之力,幫你和出版社聯系并翻譯出版真正的圖書。
浙公網安備 33010602011771號