NLog配置


配置文件路徑

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 支持兩種配置文件格式

  1. 配置在*.exe.config or web.config文件中
  2. 配置在特定的文件中

對於第一種情況, 我們使用了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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM