配置模板范本
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogLevel="Info"
internalLogFile="internal-nlog-AspNetCore.txt">
<!-- enable asp.net core layout renderers -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<!-- the targets to write to -->
<targets>
<!-- File Target for all log messages with basic details -->
<target xsi:type="File" name="allfile" fileName="nlog-AspNetCore-all-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}" />
<!-- File Target for own log messages with extra web details using some ASP.NET core renderers -->
<target xsi:type="File" name="ownFile-web" fileName="nlog-AspNetCore-own-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite}" />
<!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection -->
<target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />
</targets>
<!-- rules to map from logger name to target -->
<rules>
<!--All logs, including from Microsoft-->
<logger name="*" minlevel="Trace" writeTo="allfile" />
<!--Output hosting lifetime messages to console target for faster startup detection -->
<logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="lifetimeConsole, ownFile-web" final="true" />
<!--Skip non-critical Microsoft logs and so log only own logs (BlackHole) -->
<logger name="Microsoft.*" maxlevel="Info" final="true" />
<logger name="System.Net.Http.*" maxlevel="Info" final="true" />
<logger name="*" minlevel="Trace" writeTo="ownFile-web" />
</rules>
</nlog>
所有的布局參數
- ${cached} - 將緩存應用於另一個布局輸出。
- ${db-null} - 為數據庫呈現 DbNull
- ${exception} - 通過調用記錄器方法之一提供的異常信息
- ${level} - 日志級別(例如錯誤、調試)或級別序號(數字)
- ${literal} - 字符串 literal。(文本) - 用於轉義括號
- ${logger} - 記錄器名稱。GetLogger, GetCurrentClassLogger 等
- ${message} - (格式化的)日志消息。
- ${newline} - 換行符文字。
- ${object-path} - 呈現對象的(嵌套)屬性
- ${onexception} - 僅在為日志消息定義了異常時才輸出內部布局。
- ${onhasproperties} - 僅當事件屬性包含在日志事件中時才輸出內部布局。
- ${var} - 渲染變量
調用站點和堆棧跟蹤
- ${callite} - 調用站點(類名、方法名和源信息)
- ${callite-filename} - 調用站點源文件名。
- ${callsite-linenumber} - 呼叫站點源行編號。
- ${stacktrace} - Render the Stack trace
條件
- ${when} - 僅在滿足指定條件時輸出內部布局。
- ${whenempty} - 當內部布局生成空結果時輸出備用布局。
上下文信息
- ${activity} - 從 System.Diagnostics.Activity.Current NLog.DiagnosticSource External 捕獲跟蹤上下文
- ${activityid} - 將 System.Diagnostics 跟蹤關聯 ID 放入日志中。
- ${all-event-properties} - 記錄所有事件上下文數據。
- ${event-context} - 記錄事件屬性數據 - 替換為 ${事件屬性}
- ${event-properties} - 記錄事件屬性數據 - 重命名 ${事件-上下文}
- ${gdc} - 全局診斷上下文項。用於保存每個應用程序實例值的字典結構。
- ${install-context} - 安裝參數(傳遞給 InstallNLogConfig)。
- ${mdc} - 映射的診斷上下文 - 線程本地結構。
- ${mdlc} - 異步映射診斷上下文 - 作用域內上下文的線程本地結構。MDC 的異步版本。
- ${ndc} - 嵌套診斷上下文 - 線程本地結構。
- ${ndlc} - 異步嵌套診斷上下文 - 線程本地結構。
計數器
- ${counter} - 計數器值(在每次布局呈現時增加)
- ${guid} - 全局唯一標識符(GUID)。
- ${sequenceid} - 日志序列 ID
日期和時間
- ${date} - 當前日期和時間。
- ${longdate} - 日期和時間采用長而可排序的格式"yyyy-MM-dd HH:mm:ss.ffff"。
- ${qpc} - 高精度計時器,基於從 QueryPerformanceCounter 返回的值。
- ${shortdate} - 可排序格式為 yyyy-MM-dd 的短日期。
- ${ticks} - 當前日期和時間的分筆報價值。
- ${time} - 24 小時可排序格式的時間 HH:mm:ss.mmm。
編碼和字符串轉換
- ${json-encode} - 使用 JSON 規則轉義另一個布局的輸出。
- ${left} - 文本的剩余部分
- ${lowercase} - 將另一個布局輸出的結果轉換為小寫。
- ${norawvalue} - 防止將另一個布局呈現器的輸出視為原始值
- ${pad} - 將填充應用於另一個布局輸出。
- ${replace} - 將另一個布局輸出中的字符串替換為另一個字符串。使用正則表達式可選
- ${replace-newlines} - 將換行符替換為另一個字符串。
- ${right} - 文本的右側部分
- ${rot13} - 使用 ROT-13 解碼"加密"的文本。
- ${substring} - 文本的子字符串
- ${trim-whitespace} - 從另一個布局呈現器的結果中修剪空格。
- ${uppercase} - 將另一個布局輸出的結果轉換為大寫。
- ${url-encode} - 對另一個布局輸出的結果進行編碼,以便與 URL 一起使用。
- ${wrapline} - 以指定的行長度換行另一個布局輸出的結果。
- ${xml-encode} - 將另一個布局輸出的結果轉換為符合 XML 標准。
環境和配置文件
- ${appsetting} - 來自 .config 文件 NLog.Extended 的應用程序配置設置
- ${configsetting} - 來自 appsettings.json 的值或 ASP.NET Core & .NET Core NLog.Extensions.LoggingNLog.Extensions.HostingNLog.Web.AspNetCore
- ${environment} - 環境變量。(例如 PATH、OSVersion)
- ${environment-user} - 用戶標識信息(用戶名)。
- ${registry} - 來自 Windows 注冊表的值。
文件和目錄
- ${basedir} - 當前應用程序域的基目錄。
- ${currentdir} - 應用程序的當前工作目錄。
- ${dir-separator} - 操作系統相關目錄分隔符。
- ${file-contents} - 呈現指定文件的內容。
- ${filesystem-normalize} - 通過將文件名中不允許使用的字符替換為安全字符來篩選它們。
- ${nlogdir} - NLog.dll所在的目錄。
- ${processdir} - 應用程序的可執行進程目錄。
- ${specialfolder} - 系統特殊文件夾路徑(包括"我的文檔"、"我的音樂"、"程序文件"、"桌面"等)。
- ${tempdir} - 一個臨時目錄。
身份
- ${identity} - 線程標識信息(名稱和身份驗證信息)。
- ${windows-identity} - Thread Windows identity information (username)
- ${windows-identity} - Thread Windows identity information (username) Nlog.WindowsIdentity
集成
- ${gelf} - 將 LogEvents 轉換為 GELF 格式以發送到 Graylog NLog.GelfLayout External
- ${log4jxmlevent} - XML 事件描述與 log4j、Chainsaw 和 NLogViewer 兼容。
進程、線程和程序集
- ${appdomain} - 當前應用域。
- ${assembly-version} - 默認應用程序域中可執行文件的版本。
- ${gc} - 有關垃圾回收器的信息。
- ${hostname} - 運行進程的計算機的主機名。
- ${local-ip} - 來自網絡接口的本地 IP 地址。
- ${machinename} - 運行進程的計算機名稱。
- ${performancecounter} - 性能計數器。
- ${processid} - 當前進程的標識符。
- ${processinfo} - 有關正在運行的進程的信息,例如 StartTime、PagedMemorySize
- ${processname} - 當前進程的名稱。
- ${processtime} - 格式為 HH:mm:ss.mmm 的處理時間。
- ${threadid} - 當前線程的標識符。
- ${threadname} - 當前線程的名稱。
銀光
- ${document-uri} - 承載當前 Silverlight 應用程序的 HTML 頁面的 URI。
- ${sl-appinfo} - 有關 Silverlight 應用程序的信息。
網絡、ASP.NET 和 ASP.NET 核心
- ${aspnet-appbasepath} - ASP.NET Application base path (Content Root) NLog.WebNLog.Web.AspNetCore
- ${aspnet-application} - ASP.NET Application variable. NLog.Web
- ${aspnet-environment} - ASP.NET Environment name NLog.Web.AspNetCore
- ${aspnet-item} - ASP.NET 'HttpContext' item variable. NLog.WebNLog.Web.AspNetCore
- ${aspnet-mvc-action} - ASP.NET MVC Action Name from routing parameters NLog.WebNLog.Web.AspNetCore
- ${aspnet-mvc-controller} - ASP.NET MVC Controller Name from routing parameters NLog.WebNLog.Web.AspNetCore
- ${aspnet-request} - ASP.NET Request variable. NLog.WebNLog.Web.AspNetCore
- ${aspnet-request-contenttype} - ASP.NET Content-Type header (Ex. application/json) NLog.Web.AspNetCore
- ${aspnet-request-cookie} - ASP.NET Request cookie content. NLog.WebNLog.Web.AspNetCore
- ${aspnet-request-form} - ASP.NET Request form content. NLog.WebNLog.Web.AspNetCore
- ${aspnet-request-headers} - ASP.NET Header key/value pairs. NLog.Web.Web.AspNetCore
- ${aspnet-request-host} - ASP.NET Request host. NLog.WebNLog.Web.AspNetCore
- ${aspnet-request-ip} - Client IP. NLog.WebNLog.Web.AspNetCore
- ${aspnet-request-method} - ASP.NET Request method (GET, POST etc). NLog.WebNLog.Web.AspNetCore
- ${aspnet-request-posted-body} - ASP.NET posted body / payload NLog.WebNLog.Web.AspNetCore
- ${aspnet-request-querystring} - ASP.NET Request querystring. NLog.WebNLog.Web.AspNetCore
- ${aspnet-request-referrer} - ASP.NET Request referrer. NLog.WebNLog.Web.AspNetCore
- ${aspnet-request-routeparameters} - ASP.NET Request route parameters. NLog.WebNLog.Web.AspNetCore
- ${aspnet-request-url} - ASP.NET Request URL. NLog.WebNLog.Web.AspNetCore
- ${aspnet-request-useragent} - ASP.NET Request useragent. NLog.WebNLog.Web.AspNetCore
- ${aspnet-response-statuscode} - ASP.NET Response status code content. NLog.WebNLog.Web.AspNetCore
- ${aspnet-session} - ASP.NET Session variable. NLog.WebNLog.Web.AspNetCore
- ${aspnet-sessionid} - ASP.NET Session ID variable. NLog.WebNLog.Web.AspNetCore
- ${aspnet-traceidentifier} - ASP.NET trace identifier NLog.WebNLog.Web.AspNetCore
- ${aspnet-user-authtype} - ASP.NET User auth. NLog.WebNLog.Web.AspNetCore
- ${aspnet-user-claim} - ASP.NET User Claims 授權值 NLog.Web.AspNetCore
- ${aspnet-user-identity} - ASP.NET User variable. NLog.WebNLog.Web.AspNetCore
- ${aspnet-user-isauthenticated} - ASP.NET User authenticated? NLog.WebNLog.Web.AspNetCore
- ${aspnet-webrootpath} - ASP.NET Web root path (wwwroot) NLog.WebNLog.Web.AspNetCore
- ${iis-site-name} - IIS site name. NLog.WebNLog.Web.AspNetCore
文件位置
啟動時,NLog 會在各種文件中搜索其配置,如下所述。它將加載找到的第一個 nlog 配置。找到第一個 nlog 配置時,搜索結束。如果未找到配置,NLog 將不會執行任何日志記錄。
對於獨立的 *.exe 應用程序,將按如下方式搜索文件:
- 標准應用程序配置文件(通常為應用程序名稱.exe.config)
- 應用程序名稱.exe.nlog 在應用程序的目錄中
- NLog.config 在應用程序的目錄中(名稱敏感;使用 docker dotnet core)
- NLog.dll.nlog 位於 NLog.dll所在的目錄中(僅當 GAC 中未安裝 NLog 時)
對於 ASP.NET 應用程序,將按如下方式搜索文件:
- 標准 web 應用程序文件 web.config
- web.nlog 與 web.config 位於同一目錄中
- NLog.config 在應用程序的目錄中
- NLog.dll.nlog 位於 NLog.dll所在的目錄中(僅當 GAC 中未安裝 NLog 時)
NLog config XML(NLog配置文件也就是nlog.config的框架格式)
NLog 配置的格式設置為 XML,要么嵌入在 Visual Studio 項目配置文件(app.config 或 web.config)中,要么是獨立的 XML 文件(請記住配置文件屬性:Copy If newer
)
獨立 XML 示例:NLog.config
<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets> <target name="logfile" xsi:type="File" fileName="file.txt" /> <target name="logconsole" xsi:type="Console" /> </targets> <rules> <logger name="*" minlevel="Info" writeTo="logconsole" /> <logger name="*" minlevel="Debug" writeTo="logfile" /> </rules> </nlog>
要在/文件中嵌入NLog配置XML,請在下添加一個nlog元素並添加一個元素。例如:app.config
web.config
section
configSections
nlog
<configuration>
<configSections> <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/> </configSections> ... <nlog> <targets> <target name="logconsole" xsi:type="Console" /> </targets> <rules> <logger name="*" minlevel="Info" writeTo="logconsole" /> </rules> </nlog> </configuration>
XML 命名空間的使用是可選的,但在 Visual Studio 中啟用了智能感知。
NLog 配置 XML 在不使用命名空間時對 Xml 節點和 Xml 屬性不區分大小寫,在使用命名空間時區分大小寫。
頂級元素
可以使用以下元素作為 的子元素。 並且在任何配置中都是必需的 其他配置是可選的,在高級方案中可能很有用。nlog
targets
rules
targets
– 定義日志目標/輸出rules
– 定義日志路由規則extensions
– 從 *.dll 文件加載 NLog 擴展名include
– 包括外部配置文件variable
– 設置配置變量的值
最簡單的配置由一個規則和一個將消息路由到目標的規則 () 組成。target
logger
目標
該部分定義日志目標。每個目標都由一個元素表示。每個目標需要兩個屬性:targets
target
name
– 目標名稱type
– 目標類型 – 例如"文件"、"數據庫"、"郵件"。使用命名空間時,此屬性被命名為 。xsi:type
除了這些屬性之外,目標通常還接受其他參數,這些參數會影響診斷跟蹤的編寫方式。每個目標都有一組不同的參數,它們在項目的主頁上進行了詳細描述,並且它們是上下文相關的。Intellisense也可以在Visual Studio中使用。
例如 , File 目標接受定義輸出文件名的參數,而 Console 目標具有確定診斷跟蹤是否寫入進程的標准錯誤 (stderr) 而不是標准輸出 (stdout) 的參數。fileName
error
此示例演示了定義多個目標的部分:兩個文件、一個網絡目標和 OutputDebugString 目標:targets
<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>
日志級別
每個日志條目都有一個級別。每個記錄器都配置為包含或忽略某些級別。常見的配置是指定包含該級別和更高級別的最低級別。例如,如果最低級別為"信息",則記錄"信息"、"警告"、"錯誤"和"致命",但忽略"調試"和"跟蹤"。
日志級別(降序)如下所示:
水平 | 典型用途 |
---|---|
Fatal | 發生了不好的事情;應用程序正在下降 |
Error | 有些事情失敗了;申請可能會或可能不會繼續 |
Warn | 意想不到的事情;申請將繼續 |
Info | 正常行為,如郵件發送,用戶更新的個人資料等。 |
Debug | 用於調試;執行的查詢、用戶身份驗證、會話已過期 |
Trace | 用於跟蹤調試;開始方法 X,結束方法 X |
還有一個級別,即最高值。它不用於 LogEvents,但可用於在日志記錄規則中進行篩選。Off
規則
該部分控制哪些記錄器對象和日志級別處於活動狀態及其輸出目標。rules
在創建NLog記錄器對象時,必須提供類似於的記錄器名稱。記錄器名稱也可以通過使用記錄器名稱變為"NameSpace.ClassName"的位置從類上下文中提取。NLog.LogManager.GetLogger("blah blah")
NLog.LogManager.GetCurrentClassLogger()
使用一個元素定義單個規則,該元素篩選要匹配的記錄器對象:logger
name
– 匹配記錄器對象的記錄器名稱 - 可能包括通配符(* 和 ?)minlevel
– 要記錄的最低級別maxlevel
– 要記錄的最大級別level
– 單級記錄levels
- 以逗號分隔的要記錄的級別列表writeTo
– 以逗號分隔的目標列表,以寫入final
– 最終規則匹配后不處理任何規則enabled
- 設置為禁用規則而不刪除它false
ruleName
- 規則標識符,允許使用 和 進行規則查找。在 NLog 4.6.4 中引入Configuration.FindRuleByName
Configuration.RemoveRuleByName
finalMinLevel
- 記錄器匹配將被限制為以下規則的指定最低級別。NLog 5.0 中引入
下面的示例顯示了一個規則,該規則將匹配所有記錄器對象,而與 它們的記錄器名稱無關,因為 .同時,它只會匹配 LogEvents 與最小 LogLevel = Info(或更嚴重)。與這些條件匹配的 LogEvent 將寫入控制台目標。name="*"
<targets>
<target name="logconsole" xsi:type="Console" /> </targets> <rules> <logger name="*" minlevel="Info" writeTo="logconsole" /> </rules>
規則按順序處理。多個規則可能適用於記錄器。用於在找到匹配項后停止處理規則。final
注: 雖然規則被命名為 ,但它不定義記錄器。它根據名稱模式引用一個或多個記錄器。logger
記錄器名稱篩選器
通過將規則模式與記錄器名稱匹配,將規則映射到記錄器。規則屬性可以包含通配符(* 和 ?),以便通過通配符匹配來匹配記錄器名稱。name
name
*
- 匹配 0 個或更多字符?
- 正好匹配1個字符
使用時,記錄器名稱將具有"NameSpace.ClassName"格式。這使得為命名空間中的所有類設置篩選非常方便:NLog.LogManager.GetCurrentClassLogger()
<logger name="Name.Space.*" writeTo="target1" />
通過使用記錄器名稱篩選,還可以重定向單個類名記錄器的輸出:
<logger name="Name.Space.Class1" writeTo="target2" /> <!-- Add final=true to stop output to target1 --> <logger name="Name.Space.*" writeTo="target1" />
還可以減少單個類名記錄器的日志記錄:
<logger name="Name.Space.Class2" maxlevel="Warn" final="true" /> <!-- Blackhole that stops all but Error + Fatal --> <logger name="Name.Space.*" writeTo="target1" />
還可以完全阻止單個類名記錄器:
<logger name="Name.Space.Class3" maxlevel="Off" final="true" /> <!-- Blackhole that stops everything --> <logger name="Name.Space.*" writeTo="target1" />
在NLog 4.6之前,人們只能在模式的開頭和/或結尾使用通配符(*):
<rules>
<logger name="*" minlevel="Info" writeTo="logconsole" /> <logger name="Name.Space.*" minlevel="Debug" writeTo="f1" /> <logger name="*.Class1" minlevel="Trace" writeTo="f2" /> <logger name="*.Library.*" minlevel="Warn" writeTo="f3" /> </rules>
從 NLog 4.6 開始,通配符(* 和 ?)允許在任何位置使用。
<rules>
<logger name="*TcpTestServer[*].Connection[07].*" minlevel="Trace" writeTo="logconsole" final="true" /> <logger name="*TcpTestServer[*].Connection[??].*" minlevel="Debug" writeTo="logconsole" final="true" /> <logger name="*" minlevel="Info" writeTo="logconsole" /> </rules>
記錄器級別篩選器
規則定義匹配的日志條目級別。具有其他級別的條目將不匹配此規則。常用的說明符是 。其他說明符允許更高級的配置。minlevel
如果規則包含多個級別聲明屬性 (, 和 ),則僅使用第一個級別聲明屬性或集,其余屬性或集將被忽略。level
levels
minlevel
maxlevel
級別聲明屬性按以下順序進行處理:
level
levels
minlevel
和(這些具有相同的優先級)maxlevel
- 無(記錄所有級別)
例如:如果使用,則規則將僅使用minlevel="Warn" level="Info"
Info
如果規則被標記為並包含任何級別聲明屬性,則該屬性僅適用於指定的級別。final
final
動態記錄器級過濾器
日志記錄規則由於其靜態特性而提供高性能。配置選項非常有限。但是最近進行了更改以改進這一點:
- NLog 4.6 增加了對使用 NLog 配置變量配置級別屬性的支持。(等):
level
minlevel
<variable name='globalLevel' value='debug'/> <rules> <logger minlevel='${globalLevel}'/> </rules>
-
NLog 4.6.4 增加了對使用配置 API 查找日志記錄規則的支持
RuleName
-
NLog 4.6.7 增加了對使用 NLog 布局的支持,例如在運行時動態更改級別屬性。另請參見半動態路由規則
${gdc:globalLevel}
變量
NLog 配置變量允許您通過減少重復文本來簡化配置。變量可用於為常用(或冗長而復雜的)NLog 布局提供人名。這使得組織和構建 NLog 配置變得更加容易。
定義自定義變量,如下所示:
<variable name="varname" value="xxx" />
變量的值可以通過語法插入到屬性值中。變量值甚至可用於定義另一個變量的值。下面的示例演示如何使用預定義的變量以及定義和使用自定義變量。${varname}
shortdate
logDirectory
<nlog>
<variable name="logDirectory" value="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>
使用此語法時,必須在使用前定義變量。否則,配置初始化將失敗。注意 ${gdc} 可以用作配置變量的替代變量,因為它們的工作方式獨立於加載/卸載/重新加載不同的 NLog 配置。
NLog 配置變量可以在兩種模式下運行:
- 恆定模式 -
${varName}
- 動態模式 - (隨 NLog 4.1 一起引入)
${var:varName}
恆定模式(或靜態模式)適用於所有類型的屬性,獨立於其類型,但它們不會對運行時更改做出反應。
動態模式僅適用於 NLog 類型的屬性,並提供以下功能:Layout
- 可以從配置 API 中更改、刪除和創建變量
- 可以為變量配置默認值,例如
${var:password:default=unknown}
- 默認情況下,即使在重新加載配置后,也會保留在運行時分配的所有變量。除非已配置 .
keepVariablesOnReload="false"
NLog 4.4 引入,在 NLog 5.0 之前,默認值為
keepVariablesOnReload
false
NLog 5.0 擴展了 NLog 配置變量,以處理復雜的布局類型,如 JsonLayout + CsvLayout。前任:
<nlog>
<variable name="myJsonLayout"> <layout type="JsonLayout"> <attribute name="message" value="${messsage}"> </layout> </variable> <targets> <target name="debug" type="Debug" layout="${myJsonLayout}" /> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="debug" /> </rules> </nlog>
布局和布局呈現器
NLog最強大的資產之一是使用布局的能力。在最簡單的形式中,布局是帶有由 和 分隔的嵌入標記的文本。這些標記稱為布局呈現器,可用於將上下文信息片段插入到文本中。${
}
布局可以在很多地方使用,例如它們可以控制寫入屏幕上或發送到文件的信息的格式,也可以控制文件名本身。這是非常強大的,我們稍后會看到。
讓我們假設,我們希望使用以下命令對寫入控制台的每條消息進行批注:
- 當前日期和時間
- 發出日志消息的類和方法的名稱
- 日志級別
- 消息文本
這很簡單:
<target name="c" xsi:type="Console" layout="${longdate} ${callsite} ${level} ${message}"/>
我們可以使每個記錄器的每條消息轉到一個單獨的文件,如以下示例所示:
<target name="f" xsi:type="File" fileName="${logger}.txt"/>
如您所見,在 fileName 屬性中使用了 ${logger} 布局呈現器,這會導致將每個日志消息寫入其名稱包含記錄器名稱的文件。上面的示例將創建以下文件:
- 名稱.空間.類1.txt
- 名稱.空間.類2.txt
- 名稱.空間.類3.txt
- 其他.名稱.空間.類1.txt
- 其他.名稱.空間.類2.txt
- 其他.名稱.空間.類3.txt
異步處理和包裝器目標
NLog提供了包裝器和復合目標,它們通過添加以下功能來修改其他目標的行為:
- 異步處理(包裝的目標在單獨的線程中運行)
- 錯誤時重試
- 負載平衡
- 緩沖
- 濾波
- 故障轉移(故障轉移)
要在配置文件中定義包裝器,只需將一個目標節點嵌套在另一個目標節點中即可。您甚至可以包裝包裝器目標 - 深度沒有限制。例如,要添加具有出錯時重試功能的異步日志記錄,請將以下內容添加到配置文件中:
<targets>
<target name="n" xsi:type="AsyncWrapper"> <target xsi:type="RetryingWrapper"> <target xsi:type="File" fileName="${file}.txt" /> </target> </target> </targets>
由於異步處理是一種常見方案,因此 NLog 支持速記符號,以便為所有目標啟用異步處理,而無需指定顯式包裝器。您只需在目標元素上設置,該元素中的所有目標都將與 AsyncWrapper 目標一起包裝。async="true"
<nlog>
<targets async="true"> <!-- all targets in this section will automatically be asynchronous --> </targets> </nlog>
請記住,在使用異步后台寫入時,Flush 非常重要。它確保在應用程序退出之前寫入所有日志記錄。
默認包裝器
有時,我們要求以相同的方式包裝所有目標,例如添加緩沖和/或重試。NLog為此提供了語法。您只需將此元素放在該部分中,所有目標都將使用指定的包裝器自動包裝。請注意,這僅適用於單個截面,您可以有多個截面,以便您可以定義以類似方式包裝的目標組。<default-wrapper />
<targets />
<default-wrapper />
<targets />
<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>
在上面的示例中,我們定義了兩個緩沖文件目標和三個異步和重試網絡目標。
默認目標參數
與默認包裝類似,NLog 提供了允許您指定目標參數的默認值的功能。例如,如果您不希望文件保持打開狀態,則可以添加到每個目標,如以下示例所示:<default-target-parameters />
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>
或者,您可以指定一個應用於該部分中所有目標的單個目標。默認參數基於每個類型定義,並在 XML 文件中定義的實際屬性之前應用:<default-target-parameters />
<targets />
<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>
自動重新配置
配置文件在程序啟動時自動讀取。在長時間運行的進程(如 Windows 服務或 ASP.NET 應用程序)中,有時需要臨時提高日志級別而不停止應用程序。NLog 可以監視日志記錄配置文件,並在每次修改時重新讀取它們。要啟用此機制,只需將參數添加到配置文件中即可。autoReload="true"
<nlog autoReload="true"> ... </nlog>
請注意,自動重新配置支持包含文件,因此每次更改其中一個包含的文件時,都會重新加載整個配置。
只是為了明確說明,自動重新加載不會停止/回收 IIS 應用程序池。
包含文件
NLog 提供了包含文件功能,以便可以將配置存儲在多個文件中。
<include file="nlog-common.config" />
與 NLog 配置中的大多數屬性一樣,file 屬性可以引用變量。以下示例包含一個與運行 nlog 的計算機同名的文件。
<include file="${machinename}.config"/>
將該屬性設置為 以防止在無法加載包含文件時啟動失敗 -- 找不到文件、無效的 XML、....使用"日志記錄疑難解答"部分記錄錯誤。此屬性是可選的,缺省值為 。ignoreErrors
true
false
從 NLog 4.4.2 開始,允許使用通配符 ()。例如*
<include file="nlog-*.config"/>
可以在此處找到一個更大的示例:XML 配置<包括 />
示例
內容轉義
在配置文件中,某些字符需要轉義。由於 它是 XML 文件,所以 和 括號應使用 和 進行轉義。這也適用於屬性值,如條件。<
>
<
>
在布局中,我們需要轉義括號,冒號應該轉義,因為:}
:
:
是值分隔符。}
是布局的結尾
嵌套布局呈現器不需要轉義。此外,反斜杠也不需要轉義。
例子:
${appdomain:format={1\}{0\}}
(轉義}
)${rot13:inner=${scopenested:topFrames=3:separator=x}}
(無需轉義)${when:when=1 == 1:Inner=Test\: Hello}
(轉義:
)