Nlog笔记
NLog可以在NuGet中下载.
配置NLog输出的Targets
NLog 可以使用一个 NLog.config
的 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>
<!--输出目标:name名称f,xsi:type输出类型文件, fileName输出到程序根目录logs文件夹中-->
<target name="logfile" xsi:type="File" fileName="file.txt" />
<target name="logconsole" xsi:type="Console" />
</targets>
<rules>
<!--日志路由规则:最低级别Debug,输出到target目标fileName-->
<logger name="*" minlevel="Info" writeTo="logconsole" />
<logger name="*" minlevel="Debug" writeTo="logfile" />
</rules>
</nlog>
若想要把日志文件按时间存放文件夹,可这么写:
fileName="${basedir}/Logs/${date:format=yyyy}/${date:format=MM}/${date:format=dd}/${event-properties:filename}.log"
其中target的格式:
<targets>
<target name="f"
xsi:type="File"
fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message}"
maxArchiveFiles="5"
archiveAboveSize="10240"
archiveEvery="Day"/>
</targets>
Nlog允许用户配置单个文件大小, 放置在内容过长效率过慢,配置了大小之后, Nlog会自动创建一个新的文件副本,插入新的日志输出。
maxArchiveFiles:允许生成的副本文件最大数量
archiveAboveSize:允许单个文件得最大容量
archiveEvery:按天生成
name:输出目标的名称,用于rules中路由规则writeTo指定
fileName:包含完整的生成文件的路径和文件名
xsi:type:输出类型如下:
Chainsaw ColoredConsole Console Database Debug Debugger EventLog File LogReceiverService Memory MethodCall Network NLogViewer Null OutputDebugString PerfCounter Trace WebService |
layout:用来规定输出内容格式,语法“${属性}”,可以把上下文信息插入到日志中。
上文target代码中layout解析:
layout="${longdate} ${uppercase:${level}} ${message}"
${longdate}:日期和时间,采用可排序的长格式`yyyy-MM-dd HH:mm:ss.ffff`。
${uppercase:${level}}:uppercase将另一个布局输出的结果转换为大写;level日志级别(例如ERROR,DEBUG)或级别序数(数字)。
${message}:(格式化的)日志消息。
$ {cached} - 将缓存应用于另一个布局输出。 $ {db-null} - 为数据库渲染DbNull $ {exception} - 通过调用Logger方法之一提供的异常信息 $ {level} - 日志级别(例如ERROR,DEBUG)或级别序数(数字) $ {literal} - 字符串文字。(文本)-有用,以逃避括号 $ {logger} - 记录器名称。GetLogger,GetCurrentClassLogger等 $ {message} - (格式化的)日志消息。 $ {newline} - 换行文字。 $ {object-path} - 渲染对象的(嵌套)属性 $ {onexception} - 仅在为日志消息定义了异常时才输出内部布局。 $ {var} - 渲染变量 呼叫站点和堆栈跟踪------------------------------------------------------------- $ {callsite} - 调用站点(类名,方法名和源信息) $ {callsite-linenumber} - 呼叫站点源行号。 $ {stacktrace} - 渲染堆栈跟踪 条件------------------------------------------------------------------------ $ {when} - 仅在满足指定条件时输出内部布局。 $ {whenempty} - 当内部布局产生空结果时,输出替代布局。 上下文信息------------------------------------------------------------------- $ {activityid} - 将System.Diagnostics跟踪关联ID记录到日志中。 $ {all-event-properties} - 记录所有事件上下文数据。 $ {event-context} - 记录事件属性数据-替换为$ {event-properties} $ {event-properties} - 记录事件属性数据-重命名$ {event-context} $ {gdc} - 全局诊断上下文项。包含每个应用程序实例值的字典结构。 $ {install-context} - 安装参数(传递给InstallNLogConfig)。 $ {mdc} - 映射诊断上下文-线程局部结构。 $ {mdlc} - 异步映射诊断上下文-线程局部结构。MDC的异步版本 $ {ndc} - 嵌套诊断上下文-线程局部结构。 $ {ndlc} - 异步嵌套诊断上下文-线程本地结构。 专柜----------------------------------------------------------------------- $ {counter} - 一个计数器值(在每个布局渲染中增加) $ {guid} - 全局唯一标识符(GUID)。 $ {sequenceid} - 日志序列号 日期和时间------------------------------------------------------------------ $ {date} - 当前日期和时间。 $ {longdate} - 日期和时间,采用可排序的长格式`yyyy-MM-dd HH:mm:ss.ffff`。 $ {qpc} - 高精度计时器,基于QueryPerformanceCounter返回的值。 $ {shortdate} - 短日期,格式为yyyy-MM-dd。 $ {ticks} - 当前日期和时间的“ Ticks”值。 $ {时间} - 在24小时,可排序的格式HH的时间:MM:ss.mmm。 编码和字符串转换-------------------------------------------------------------- $ {json-encode} - 使用JSON规则转义另一个布局的输出。 $ {left} - 文字的左半部分 $ {小写} - 将另一个布局输出的结果转换为小写。 $ {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.Logging NLog.Extensions.Hosting NLog.Web.AspNetCore $ {environment} - 环境变量。(例如PATH,OSVersion) $ {environment-user} - 用户身份信息(用户名)。 $ {}注册表 - 从Windows注册表中的值。 文件和目录-------------------------------------------------------------------- $ {basedir} - 当前应用程序域的基本目录。 $ {currentdir} - 应用程序的当前工作目录。 $ {file-contents} - 呈现指定文件的内容。 $ {filesystem-normalize} - 通过将文件名替换为安全字符来过滤文件名中不允许的字符。 $ {} nlogdir - 其中NLog.dll所在的目录。 $ {specialfolder} - 系统专用文件夹路径(包括“我的文档”,“我的音乐”,“程序文件”,“桌面”等)。 $ {tempdir} - 临时目录。 身分识别---------------------------------------------------------------------- $ {identity} - 线程身份信息(名称和身份验证信息)。 $ {windows-identity} - 线程Windows身份信息(用户名) $ {windows-identity} - 线程Windows身份信息(用户名) Nlog.WindowsIdentity 整合方式---------------------------------------------------------------------- $ {gelf} - 将日志转换为GELF格式 NLog.GelfLayout 外部 $ {log4jxmlevent} - 与log4j,Chainsaw和NLogViewer兼容的XML事件描述。 进程,线程和程序集-------------------------------------------------------------- $ {appdomain} - 当前的应用程序域。 $ {assembly-version} - 默认应用程序域中可执行文件的版本。 $ {gc} - 有关垃圾收集器的信息。 $ {hostname} - 运行该进程的计算机的主机名。 $ {local-ip} - 来自网络接口的本地IP地址。 $ {machinename} - 运行进程的计算机名。 $ {performancecounter} - 性能计数器。 $ {processid} - 当前进程的标识符。 $ {processinfo} - 有关正在运行的进程的信息。例如StartTime,PagedMemorySize $ {processname} - 当前进程的名称。 $ {processtime} - 格式为HH:mm:ss.mmm的处理时间。 $ {threadid} - 当前线程的标识符。 $ {threadname} - 当前线程的名称。 Silverlight------------------------------------------------------------------------ $ {document-uri} - 承载当前Silverlight应用程序的HTML页面的URI。 $ {sl-appinfo} - 有关Silverlight应用程序的信息。 Web,ASP.NET和ASP.NET Core---------------------------------------------------------- $ {ASPNET-appbasepath} - ASP.NET应用程序的基本路径(内容根) NLog.Web NLog.Web.AspNetCore $ {ASPNET应用} - ASP.NET应用程序变量。 网络日志 $ {ASPNET环境} - ASP.NET环境名称 NLog.Web.AspNetCore $ {ASPNET项} - ASP.NET`HttpContext`项变量。 NLog.Web NLog.Web.AspNetCore $ {ASPNET-MVC-行动} - ASP.NET MVC动作名称 NLog.Web NLog.Web.AspNetCore $ {ASPNET-MVC控制器} - ASP.NET MVC控制器名称 NLog.Web NLog.Web.AspNetCore $ {ASPNET请求} - ASP.NET请求变量。 NLog.Web NLog.Web.AspNetCore $ {ASPNET-请求的contentType} - ASP.NET Content-Type头(实施例应用/ JSON) NLog.Web.AspNetCore $ {ASPNET请求,饼干} - ASP.NET请求的cookie的内容。 NLog.Web NLog.Web.AspNetCore $ {ASPNET请求形式} - ASP.NET请求表的内容。 NLog.Web NLog.Web.AspNetCore $ {ASPNET请求报头} - ASP.NET部首键/值对。 NLog.Web NLog.Web.AspNetCore $ {ASPNET请求主机} - ASP.NET请求主机。 NLog.Web NLog.Web.AspNetCore $ {aspnet-request-ip} - 客户端IP。 NLog.Web NLog.Web.AspNetCore $ {ASPNET请求-方法} - ASP.NET请求方法(GET,POST等)。 NLog.Web NLog.Web.AspNetCore $ {ASPNET请求,贴体} - ASP.NET贴体/净荷 NLog.Web NLog.Web.AspNetCore $ {ASPNET-请求的查询字符串} - ASP.NET请求的查询字符串。 NLog.Web NLog.Web.AspNetCore $ {ASPNET,请求引荐} - ASP.NET请求引用。 NLog.Web NLog.Web.AspNetCore $ {ASPNET请求的URL} - ASP.NET请求URL。 NLog.Web NLog.Web.AspNetCore $ {ASPNET请求,用户代理} - ASP.NET请求用户代理。 NLog.Web NLog.Web.AspNetCore $ {ASPNET-响应的StatusCode} - ASP.NET响应状态代码的内容。 NLog.Web NLog.Web.AspNetCore $ {ASPNET会话} - ASP.NET Session变量。 NLog.Web NLog.Web.AspNetCore $ {ASPNET-的SessionID} - ASP.NET会话ID的变量。 NLog.Web NLog.Web.AspNetCore $ {ASPNET-traceidentifier} - ASP.NET跟踪标识 NLog.Web NLog.Web.AspNetCore $ {ASPNET用户-的authType} - ASP.NET用户验证。 NLog.Web NLog.Web.AspNetCore $ {ASPNET用户身份} - ASP.NET用户变量。 NLog.Web NLog.Web.AspNetCore $ {ASPNET用户-isauthenticated} - ASP.NET用户身份验证? NLog.Web NLog.Web.AspNetCore $ {ASPNET-webrootpath} - ASP.NET Web根目录路径(wwwroot文件) NLog.Web NLog.Web.AspNetCore $ {iis-site-name} - IIS网站的名称。 NLog.Web NLog.Web.AspNetCore |
<rules>
<logger name="*" minlevel="Debug" writeTo="file" />
</rules>
日志级别有如下,自上而下,等级递增。 - Debug - 同样是记录信息,不过出现的频率要比Trace少一些,一般用来调试程序 - Info - 信息类型的消息 - Warn - 警告信息,一般用于比较重要的场合 - Error - 错误信息 - Fatal - 致命异常信息。一般来讲,发生致命异常之后程序将无法继续执行 |
minlevel="Debug":所有级别等于或者高于Debug的日志信息都写入到“file”这个目标里。同理,maxlevel则为小于;同时有minlevel和maxlevel的则为在这范围内。
写入日志信息
var logger = NLog.LogManager.GetCurrentClassLogger();
logger.Info("我打出了Nlog日志");
结果:
日志最佳实践
- 每个类中,Logger 应该被设置成一个静态变量
每创建一个 Logger 都会有一定的性能损耗,因为它必须获取锁和分配对象
因此建议像这样创建logger:namespace MyNamespace { public class MyClass { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); } }
- Logger 应该处理字符串格式化
避免预先执行字符串分配或字符串连接,而是让日志记录器执行格式化。这将允许NLog推迟格式化并减少开销。因此,建议您这样执行日志:
logger.Info("Hello {0}", "Earth");
也可使用单例结构:
public class LogHelper { private static Logger logger; private LogHelper() { logger = LogManager.GetCurrentClassLogger(); } public void WriteLog() { logger.Info("Write Logs"); } #region 单例 private static LogHelper instance; public static LogHelper Instance() { if (instance == null) { lock (typeof(LogHelper)) { if (instance == null) { instance = new LogHelper(); } } } return instance; } #endregion }
- Logger 应该记录异常
避免将异常作为格式化参数,而是将其显式地作为第一个参数提供。这将帮助NLog目标提供更好的日志记录。
try { } catch (Exception ex) { logger.Error(ex, "Something bad happened"); }
- 从 NLog.config XML配置文件中验证配置
默认情况下,NLog 允许记录所有异常,因此,日志记录的问题不会导致应用程序中断。但是为更多的应用程序记录日志是至关重要的,所以如果 NLog 配置文件的实例错误,那将是致命的。增加 throwConfigExceptions="true" 会使 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" throwConfigExceptions="true"> </nlog>
- Remember to Flush
当应用停止运行时,NLog 默认会自动尝试刷新. Microsoft Windows 给.Net应用程序在被终止前执行关机(通常是2秒)的时间。如果一个 NLog配置了需要网络传输的 NLog Tagets (Http、Mail、Tcp)运行在Linux/Windows,那么执行一个手动的 Flush/Shutdown 是一个明智之举。
NLog.LogManager.Shutdown(); // 刷新并关闭内部线程和计时器。
运行在Mono/Linux 的 .NET 应用在进入应用程序关闭阶段前,必需去停止线程和计时器. 如果未执行完成会导致未处理的异常和分割错误,以及其他不可预知的行为。
AsyncWrapper 提供一个便捷的快捷设置方式,在配置文件中添加 async="true"
即可:
<?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 async="true">
<target name="logfile" xsi:type="File" fileName="file.txt" />
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logfile" />
</rules>
</nlog>
这样设置之后,所有写入文件的日志将以异步的方式,可以提高调用线程的响应能力。