.Net6中NLog配置信息记录
配置模板范本
<?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}
(转义:
)