配置文件路徑
NLog會在以下位置查找配置文件,在啟動讀取:
對於獨立的exe可執行應用程序,會在下面的位置查找配置文件:
- 應用程序配置文件 (一般命名為 applicationname.exe.config)
- 應用程序目錄下面的applicationname.exe.nlog文件
- 應用程序目錄下面的NLog.config文件
- NLog.dll所在目錄下面的NLog.dll.nlog文件 (在NLog沒有安裝在GAC時有效)
- 環境變量中的"NLOG_GLOBAL_CONFIG_FILE"配置 (NLog 1.0有效,NLog 2.0中被移除)
如果是ASP.NET應用程序,會在下面的位置查找配置文件:
- web.config文件
- web.config所在目錄下面的web.nlog文件
- 站點下面的NLog.config文件
- NLog.dll所在目錄下面的NLog.dll.nlog文件 (在NLog沒有安裝在GAC時有效)
- 環境變量中的"NLOG_GLOBAL_CONFIG_FILE"配置 (NLog 1.0有效,NLog 2.0中被移除)
.NET Compact Framework沒有應用配置文件 (*.exe.config) 或者環境變量, 所以NLog僅僅會在以下地方查找配置文件
- 應用目錄下面的applicationname.exe.nlog文件
- 應用下面的NLog.config文件
- NLog.dll所在目錄下面的NLog.dll.nlog文件 (在NLog沒有安裝在GAC時有效)
配置文件格式
NLog 支持兩種配置文件格式
- 配置在*.exe.config or web.config文件中
- 配置在特定的文件中
對於第一種情況, 我們使用了configSections特性, 配置信息如下:
<configuration>
<configSections>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
</configSections>
<nlog>
</nlog>
</configuration>
對於第二種情況,配置文件是一個以 <nlog />元素為根節點的XML文件。 命名空間可選,如果配置了,可以再Visual Studio中提供智能提示
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</nlog>
注意,如果不使用命名空間,NLog配置是不區分大小寫的,如果使用了,就要區分大小寫。
<nlog />根節點下面有如下的子元素。 頭兩個元素是配置文件必須的,其他的為可選配置:
- <targets /> – 定義日志 targets/outputs
- <rules /> – 定義日志路由規則
- <extensions /> – 從*.dll文件中加載日志擴展
- <include /> – 引入其他的外部配置
- <variable /> – 設置配置變量的值
Targets
<targets /> 節點定義了配置的 Targets. 每一個target都被定義為了一個元素節點。下面是target必須包含的特性:
- name – target 的名稱
- type – target 類型– 比如 "File", "Database", "Mail"。如果加載了命名空間,配置名稱為 xsi:type.
除了這兩個特性, targets 還有其他的參數, 用於配置日志的輸出。
比如 – File target 接收fileName 參數,用於定義輸出的日志文件名稱。Console target 有一個error參數,用於將跟蹤記錄信息輸出到錯誤信息欄,而不是原來的輸出信息欄。
一個<targets /> 可以包括多個targer,比如下面的例子,兩個文件targer, 一個network target 和一個 OutputDebugString target:
<targets>
<target name="f1" xsi:type="File" fileName="file1.txt"/>
<target name="f2" xsi:type="File" fileName="file2.txt"/>
<target name="n1" xsi:type="Network" address="tcp://localhost:4001"/>
<target name="ds" xsi:type="OutputDebugString"/>
</targets>
NLog提供了許多預定義的 Targets。當然,也能夠容易的創建自定義的Targets。
Rules
Log 路由規則定義在 <rules /> 節點。這是一個很簡單的路由表,我們定義了日志的等級(logger對象)和輸出方式(targets)的關聯。規則會從列表的第一條開始匹配。當一個規則匹配,日志信息會通過該規則關聯的targer輸出。如果該規則定義了final標記,那么,就不會繼續匹配下面的規則。
每一條路由都是一個<logger /> 元素, 具有下面的特性
- name – source/logger 的名稱 (可能包含通配符 * )
- minlevel – 該路由可以匹配的最小日志等級
- maxlevel – 該路由可以匹配的最大日志等級
- level – 該路由匹配的日志等級
- levels - 該路由可以匹配的多個日志等級
- writeTo – 使用哪個target來輸出日志
- final – 匹配了本條路由以后,不再匹配后面的路由
rules 示例
所有Name.Space.Class1類輸出的Debug等級以上的日志,都通過"f1"target輸出
<logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" />
所有Name.Space.Class1類輸出的Debug或者Error等級的日志,都通過"f1"target輸出
<logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" />
命名空間Name.Space下的所有類輸出的日志,都通過"f3","f4"target輸出
<logger name="Name.Space.*" writeTo="f3,f4" />
命名空間Name.Space下的所有類輸出的,等級在Debug和Error之間的日志(包括 Debug,Info,Warn,Error) 會被攔截 (沒有配置writeTo,所以沒有輸出)。通過配置final="true",后面的路由不會匹配。
<logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" />
在簡單的應用場景下,可以只有一個targer和一個rule。但是,隨着應用的發展,你會發現多個targer和多個rule能夠更加的靈活,適應更多的應用場景
Layouts 和 layout renderers
NLog一個強大的地方,就是可以使用 layouts。一個簡單的form布局,就是由${和}標記組成的文本。這個標記叫做Layout Renderers, 用於在生成的日志文件中插入信息
布局能夠在許多地方使用,比如,它能夠控制輸出到文本或者控制台的信息格式,輸出文件的文件名樣式。他非常的強大,我們接下去就會看到。
現在,我們假設,我們想輸出的控制台信息具有如下的格式:
- 正確的日期時間
- 調用日志輸出的類名和方法名稱
- 日志等級
- 日志信息
這非常簡單:
<target name="c" xsi:type="Console" layout="${longdate} ${callsite} ${level} ${message}"/>
我們能把每個Logger輸出的日志,都輸出到不同的日志文件:
<target name="f" xsi:type="File" fileName="${logger}.txt"/>
你會返現, fileName特性使用了${logger} 布局渲染,這使得輸出的日志文件的文件名稱都包含該Logger的名稱,上面的例子會輸出下面的日志文件:
- Name.Space.Class1.txt
- Name.Space.Class2.txt
- Name.Space.Class3.txt
- Other.Name.Space.Class1.txt
- Other.Name.Space.Class2.txt
- Other.Name.Space.Class3.txt
Include files
有時,我們希望能夠把配置文件分成很多小塊。 NLog 提供了一套包含其他外部文件的機制。為了引入外部文件,你僅僅需要寫一個標簽。 他只需要一個file特性,和許多NLog配置的特性一樣,通過layout renderers,比如${},可以獲取動態的值,實現了根據環境的不同,調用不同的配置
The following configuration example demonstrates this, by loading a file whose name is derived from the name of the machine we’re running on.
<nlog>
...
<include file="${basedir}/${machinename}.config"/>
...
</nlog>
還有可選配置, ignoreErrors="true",默認是false,能夠攔截因為文件不存在或者文件格式不正確而產生的錯誤。如果設置了ignoreErrors="true",使用Troubleshooting logging 節點來記錄日志錯誤
Variables
變量能夠用於記錄常常變化或者復雜的值 (比如文件名稱),定義參數使用如下語法:
<variable name="var" value="xxx" />
如果我們定義好了變量,就能在layout renderers中使用 – 通過 ${var} 語法,就像下面的例子:
<nlog>
<variable name="logDirectory" value="${basedir}/logs/${shortdate}"/>
<targets>
<target name="file1" xsi:type="File" fileName="${logDirectory}/file1.txt"/>
<target name="file2" xsi:type="File" fileName="${logDirectory}/file2.txt"/>
</targets>
</nlog>
Automatic reconfiguration
配置文件會在程序啟動的時候自動讀取。在程序運行期間,我們有時希望能夠更改配置,不需要重啟應用及可以生效。NLog能夠監控配置文件,在其更改的時候,自動重新讀取配置。要使用這套機制,只需要在配置文件中增加autoReload="true"特性
<nlog autoReload="true">
...
</nlog>
注意,重新加載的配置機制也會監控外部配置(include節點中的外部配置文件),所以,如果我們變更了外部文件中的配置,也會重新加載NLog配置
要明確,自動加載配置,並不需要回收IIS的應用程序池
Troubleshooting logging
有時候,我們明明配置好了,卻沒有寫入日志。這可能有很多的原因。最常見的是權限不足,通常,ASP.NET 進程, 及aspnet_wp.exe 或者 w3wp.exe 進程沒有向指定路徑寫入日志的權限
NLog在運行時不會拋出異常。下面的設置能夠更改這個默認行為:
- <nlog throwExceptions="true" /> - 在配置文件中添加throwExceptions特性,是的NLog會將異常拋出。這個特性常用於開發環境快速定位錯誤,但在開發環境中,建議設置為false。
- <nlog internalLogFile="file.txt" /> - 在配置文件中添加internalLogFile特性,是的NLog會在特定的文件中記錄自身的錯誤。
- <nlog internalLogLevel="Trace|Debug|Info|Warn|Error|Fatal" /> – 確定需要記錄的內部日志等級。等級越高,記錄的越詳細
- <nlog internalLogToConsole="false|true" /> – 內部錯誤信息是否輸出到控制台
- <nlog internalLogToConsoleError="false|true" /> – 內部錯誤信息是否輸出到錯誤信息框
Asynchronous processing and wrapper targets
NLog提供了wrapper和復合targets用於控制其他target的行為:
- asynchronous processing (wrapped target runs in a separate thread)
- retry-on-error
- load balancing
- buffering
- filtering
- failover (failover)
在配置文件中定義wrapper,就是target標簽的簡單嵌套。你甚至可以wraper再嵌套wraper - 嵌套層數沒有限制。比如,retry-on-error wrapper嵌套在asynchronous wrapper中,配置文件如下:
<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" ,所有其下的元素,都會具有異步特性
<nlog>
<targets async="true">
<!-- all targets in this section will automatically be asynchronous -->
</targets>
</nlog>
Default wrappers
有時,我們需要定義多有的target都有同樣的wrapper,比如,為所有的target添加 buffering and/or retrying包裝器。 NLog 提供了 <default-wrapper /> 語法來實現這一功能。你只需要在targets元素中配置<default-wrapper />元素,那么該targets下面的target都會具有配置的warpper。
<nlog>
<targets>
<default-wrapper xsi:type="BufferingWrapper" bufferSize="100"/>
<target name="f1" xsi:type="File" fileName="f1.txt"/>
<target name="f2" xsi:type="File" fileName="f2.txt"/>
</targets>
<targets>
<default-wrapper xsi:type="AsyncWrapper">
<wrapper-target xsi:type="RetryingWrapper"/>
</default-wrapper>
<target name="n1" xsi:type="Network" address="tcp://localhost:4001"/>
<target name="n2" xsi:type="Network" address="tcp://localhost:4002"/>
<target name="n3" xsi:type="Network" address="tcp://localhost:4003"/>
</targets>
</nlog>
Default target parameters
同默認的wrapper一樣,NLog提供了<default-target-parameters />來實現統一配置一個targets元素下面的target元素參數。比如,如果你不想文件一直保持打開狀態,你可以設置keepFileOpen="false",代碼如下:
<nlog>
<targets>
<target name="f1" xsi:type="File" fileName="f1.txt" keepFileOpen="false"/>
<target name="f2" xsi:type="File" fileName="f2.txt" keepFileOpen="false"/>
<target name="f3" xsi:type="File" fileName="f3.txt" keepFileOpen="false"/>
</targets>
</nlog>
你可以使用<default-target-parameters />簡化上面的寫法
<source lang="xml">
<nlog>
<targets>
<default-target-parameters xsi:type="File" keepFileOpen="false"/>
<target name="f1" xsi:type="File" fileName="f1.txt"/>
<target name="f2" xsi:type="File" fileName="f2.txt"/>
<target name="f3" xsi:type="File" fileName="f3.txt"/>
</targets>
</nlog>
