关于 NLog 输出 json 格式日志的配置
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="Trace" >
<targets async="true">
<target name="blackhole" xsi:type="Null" />
<target name="console" xsi:type ="Console" />
<target name="file" xsi:type="File" fileName="/niplogs/${var:app}.json"
concurrentWrites="true"
archiveFileName="/niplogs/${var:app}.json.{#}"
archiveAboveSize="104857600"
archiveEvery="Day"
archiveNumbering="Rolling"
maxArchiveFiles="5"
enableFileDelete="true"
>
<layout xsi:type="JsonLayout">
<attribute name="app" encode="false" >
<layout xsi:type="JsonLayout">
<attribute name="name" layout="${var:app}"/>
<attribute name="group" layout="${var:group}"/>
</layout>
</attribute>
<attribute name="env" layout="${var:env}"/>
<attribute name="level" layout="${level}"/>
<attribute name="thread" layout="${threadid}"/>
<attribute name="logger" layout="${logger}" escapeUnicode="false"/>
<attribute name="message" layout="|${level}|${logger}|${message}" escapeUnicode="false"/>
<attribute name="exception" encode="false" >
<layout xsi:type="JsonLayout">
<attribute name="type" layout="${exception:format=Type}"/>
<attribute name="message" layout="${exception:format=Message}" escapeUnicode="false"/>
<attribute name="stacktrace" layout="${exception:format=ToString}" escapeUnicode="false"/>
</layout>
</attribute>
<attribute name="properties" encode="false" >
<layout xsi:type="JsonLayout" includeAllProperties="true" maxRecursionLimit="2" />
</attribute>
<attribute name="time" layout="${longdate}"/>
<attribute name="log" encode="false" >
<layout xsi:type="JsonLayout">
<attribute name="time" layout="${date:format=yyyy-MM-ddTHH\:mm\:ss.fffZ}"/>
</layout>
</attribute>
</layout>
</target>
</targets>
<rules>
<!-- Skip Microsoft logs and so log only own logs-->
<logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true"/>
<!-- set up a rule to log to the azure storage target! -->
<logger name="*" minlevel="Trace" maxlevel="Fatal" writeTo="console" />
<logger name="*" writeTo="file" />
</rules>
</nlog>
关于配置文件中的自定义变量的配置
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceScopeFactory factory)
{
LogManager.Configuration.Variables["hostname"] = Dns.GetHostName();
// 方便按服务检索日志
LogManager.Configuration.Variables["app"] = "app name";
// 方便按一组服务的方式检索完成的数据流转日志(一条数据可能会在多个服务中流转)
LogManager.Configuration.Variables["group"] = "app group name";
LogManager.Configuration.Variables["env"] = env.EnvironmentName;
}
关于 exception 部分的 JsonLayout 的使用方式
// 下面的代码在输出日志时,会使用 ex 变量来填充上述配置文件中的 exception 部分
_logger.Error(ex, $"this is a demo error.")
关于 properties 部分的 JsonLayout 的使用方式
// 下面的代码在输出日志时,会使用 eventInfo.Properties 中的字段来生成上述配置文件中的 properties 部分
var eventInfo = new LogEventInfo(logLevel, loggerName, message);
eventInfo.Properties.Add("studentId", 100);
eventInfo.Properties.Add("studentName", "小明");
logger.Log(eventInfo);
当然如果不想使用 includeAllProperties="true" 来输出所有 properties,也可以像 exception 部分一样指定需要输出的属性名