NLog官网:https://nlog-project.org/
前言
NLog是适用于各种.net平台(包括.net standard)的灵活而免费的日志记录平台。通过NLog, 可以轻松地写入多个目标。(数据库、文件、控制台), 并动态更改日志记录配置。
NLog支持结构化和传统日志记录。NLog的特点: 高性能、易于使用、易于扩展和灵活配置。
基本配置
Nuget获取NLog库包:https://www.nuget.org/packages/NLog
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd" autoReload="true" throwExceptions="false" internalLogLevel="Info" internalLogFile="./logs/nlog-internal.log">
NLog 根节点以下几种配置需要注意
autoReload
:配置修改是否自动加载。throwExceptions
:日志出现异常时是否需要抛出异常,若配置为true
日志记录异常时由于没有捕获异常,会导致程序挂掉。internalLogLevel
:表示nlog日志的执行日志记录等级。internalLogFile
:表示nlog日志的执行日志记录的位置。通过./XXXX
的方式可以配置到程序的相对目录。
日志等级
Nlog支持以下几种日志等级
Level | FirstCharacter | Ordinal |
---|---|---|
Trace | T | 0 |
Debug | D | 1 |
Info | I | 2 |
Warn | W | 3 |
Error | E | 4 |
Fatal | F | 5 |
Off | O | 6 |
在日志输入时可以通过${level}
输入日志等级,或者通过${level:format=FirstCharacter}
输出日志等级的简写,查看所有参数输出可以到这里查看。
在代码中我们不支持Off等级的输出。通过NLog不需要我们认为对日志模块进行启动或关闭,在我们程序关闭后,它会自动关闭日志。相关的Nlog的日志可以在internalLogFile
配置的路径中中查看到,同时在生产环境建议将internalLogLevel
NLog自己的日志等级设置为Info,这样只会记录关键的日志信息。
我们输入到文件中,输入配置如下:
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" /> <logger name="*" minlevel="Debug" writeTo="f" />
具体layout配置:https://nlog-project.org/config/?tab=layout-renderers
将NLog消息写入Splunk
Nuget获取Splunk库包 https://www.nuget.org/packages/NLog.Targets.Splunk
配置
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"> <extensions> <add assembly="Nlog.Targets.Splunk"/> extensions> <target name="SplunkLog" xsi:type="SplunkHttpEventCollector" ServerUrl="http://192.168.100.135:18088" Token="8AF31D06-6509-48C5-AAB3-A907FA65FF32" Channel="dev-erp-mes" RetriesOnError="0" IgnoreSslErrors="true" layout="${message} ${exception:format=tostring}" includeEventProperties="true"/> targets> <rules> <logger name="*" levels="Info,Error,Warn,Debug,Fatal" writeTo="SplunkLog" /> rules> 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"> <extensions> <add assembly="Nlog.Targets.Splunk"/> extensions> <targets async="true"> <target name="asyncFile" xsi:type="File" layout="[${longdate}] [${level}] [${logger}] [${message}] ${newline} ${exception:format=tostring}" fileName="${basedir}/log/${shortdate}.txt" archiveFileName="${basedir}/log/archives/log.{#####}.txt" archiveAboveSize="102400000" archiveNumbering="Sequence" concurrentWrites="true" keepFileOpen="false" encoding="utf-8" /> <target name="SplunkLog" xsi:type="SplunkHttpEventCollector" ServerUrl="http://192.168.100.135:18088" Token="8AF31D06-6509-48C5-AAB3-A907FA65FF32" Channel="dev-erp-mes" RetriesOnError="0" IgnoreSslErrors="true" layout="${message} ${exception:format=tostring}" includeEventProperties="true"/> <target name="console" xsi:type="console"/> targets> <rules> <logger name="*" levels="Info,Error,Warn,Debug,Fatal" writeTo="asyncFile" /> <logger name="*" levels="Info,Error,Warn,Debug,Fatal" writeTo="SplunkLog" /> <logger name="*" minlevel="Error" writeTo="console" /> rules> nlog>
ASP.NET Core 1和2以及Microsoft依赖注入
Nuget获取NLog.Extensions.Logging库包:https://www.nuget.org/packages/NLog.Extensions.Logging/
NLog模板
使用模板的原因:提升性能如果当日志等级不满足的情况下不会去执行字符串的格式处理
错误代码
// 当日志等级不满足的情况下也会调用时间ToString()格式化时间 logger.Fatal($"时间:{DateTime.Now:yyyy-MM-dd hh:mm:ss}", DateTime.Now);
正确使用如下默认格式
查看日志源代码
public void Fatal([Localizable(false)] string message, TArgument argument) { if (IsFatalEnabled) { WriteToTargets(LogLevel.Fatal, message, new object[] { argument }); } }
可以看出只有当IsFatalEnabled值为true才会执行日志模板格式化代码不
一共有以下4种模板
var d = new { A = "xxx", b = "AAA" };
默认格式
//默认模板直接Convert.ToString()
logger.Fatal("默认{name:yyyy-MM-dd hh:mm:ss}fffdweew", DateTime.Now);
输出:默认2019-08-22 03:07:53fffdweew
转义符
//转义符
logger.Fatal("转义{{name}}dddd", d);
输出:转义{name}dddd
引号
//加引号
logger.Fatal("加引号{$name}sss", d);
输出:加引号"{ A = xxx, b = AAA }"sss
json序列化
//序列化
logger.Fatal("序列化{@name}sdsdsdsd", list);
输出:序列化{"A":"xxx", "b":"AAA"}sdsdsdsd