NLog is a flexible and free logging platform for various .NET platforms, including .NET standard. NLog makes it easy to write to several targets. (database, file, console) and change the logging configuration on-the-fly.
一.配置
使用NuGet添加NLog
NLog 支持两种文件格式:
- 在标准的 *.exe.config 或 web.config 中嵌入配置
- 在单独的文件中进行配置
NLog 配置文件是一个以 nlog
为根节点的 XML 文件。nlog
节点可以添加命名空间,以开启 Visual Studio 的 Intellisense 功能。
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</nlog>
以下元素可以作为 nlog
节点的子节点,前两种元素在所有 NLog 配置文件中都必须存在,剩余元素是可选的。
targets
- 定义日志目标/输出rules
- 定义日志路由规则extensions
- 定义要加载的 NLog 扩展项 *.dll 文件includes
- 定义要包含的外部配置文件variables
- 设置配置变量的值
在 nlog
节点中设置属性autoReload="true"
,NLog 会监视配置文件,并在配置文件发生更改时自动重新载入配置文件而不需要重启应用程序。该功能支持通过 include
包含的子配置文件。示例如下,
<nlog autoReload="true">
...
</nlog>
1.1 Targets
targets
节点中定义了一系列日志输出目标,每一个输出目标是一个 target
元素。对于每一个 target
元素,name
属性和 type
属性是必须要指定的:
name
-target
的名字。路由规则根据该属性将日志信息路由到当前目标。type
-target
的类型。当使用了 xsi 命名空间时,该属性被命名为 xsi:type。目前 NLog 支持的输出目标列表:Targets
不同类型的 target
节点可以接受不同的属性。例如对于 File
目标,fileName
参数指定了日志文件的文件名;对于 Console
目标,error
参数指定日志信息是写到标准错误流还是标准输出流。NLog 内置了许多预定义类型,也可以自定义输出目标类型,详见如何自定义输出目标。
以下是 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>
1.2 Rules
rules
节点是日志路由规则的集合,由一个或多个 logger
元素组成。每个 logger
元素记录了 logger 的名字、目标输出以及要处理的日志等级。NLog 从路由规则表的第一个 logger
开始处理,如果当前 logger
有效,则日志信息将被输出到指定的 target
。如果某个 logger
被标记为 final
,那么其后的 logger
都会被忽略。
logger
包含下列属性:
name
- logger的名字(可以使用通配符*)minLevel
- 最小日志等级maxLevel
- 最大日志等级level
- 单一的日志等级levels
- 以逗号分割的日志等级列表writeTo
- 以逗号分割的输出目标列表final
- 标记当前规则为最后一条规则enabled
- 使能当前规则
如果在一条规则中定义了多个日志等级相关的属性(level
, levels
, minLevel
和 maxLevel
),按照优先级只生效当前优先级最高的属性。等级相关属性优先级如下,
level
levels
minLevel
和maxLevel
- 没有设置(所有等级的日志都会被记录)
以下是 rules
节点的例子:
<rules>
<logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" />
<logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" />
<logger name="Name.Space.*" writeTo="f3,f4" />
<logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" />
</rules>
- 命名空间
Name.Space
下类Class1
中高于Debug
级别的日志信息将被写入输出目标f1
- 命名空间
Name.Space
下类Class1
中级别为Debug
和Error
的日志信息将被写入target:f1
- 命名空间
Name.Space
下所有类中的日志信息将被写入target:f3, f4
- 命名空间
Name.Space
下所有类中级别在Debug
和Error
之间 (Debug
,Info
,Warn
和Error
) 的日志信息不被记录(因为没有指定属性writeTo
)。由于标记了属性final
,之后的logger
都会被忽略。
NLog 支持以下的 记录日志等级:
Trace
- 非常详细的日志,包含最详尽的信息,例如协议的有效载荷. 该日志等级通常仅在开发过程中被使用;Debug
- 调试信息,详尽信息次于Trace
,在生产环境中通常不启用;Info
- 信息消息, 通常在生产环境中通常启用;Warn
- 警告信息,通常用于非关键问题,这些问题可以恢复,或者是暂时的故障;Error
- 错误信息 - 多数情况下记录Exceptions(异常)信息;Fatal
- 非常严重的错误!
1.3 Extensions
extensions
节点可以添加额外的NLog元包或自定义功能,语法为 。assembly
属性指定的被包含程序集不带后缀 .dll
。示例如下,
<nlog>
<extensions>
<add assembly="MyAssembly" />
</extensions>
<targets>
<target name="a1" type="MyFirst" host="localhost" />
</targets>
<rules>
<logger name="*" minLevel="Info" appendTo="a1" />
</rules>
</nlog>
NLog 4.0 之后,与 NLog.dll
同目录下名如 NLog*.dll
的程序集(如 NLog.CustomTarget.dll
)会被自动加载。
1.4 Includes
include
节点指定当前配置文件包含多个子配置文件,语法为 。通过 ${}
语法可以使用环境变量,下例展示包含一个名为当前机器名的配置文件。
<nlog>
...
<include file="${machinename}.config" />
...
</nlog>
NLog 4.4.2 之后可以使用通配符 *
指定多个文件。例如,<include file="nlog-*.config" />
(5) Variables
variable
元素定义了配置文件中需要用到的变量,一般用来表示复杂或者重复的表达式(例如文件名)。变量需要先定义后使用,否则配置文件将初始化失败。定义变量的语法如下:
<variable name="var" value="xxx" />
定义变量之后,可以通过 ${var}
语法来使用:1<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>
以上参考:
https://www.jianshu.com/p/0a3d850b1228
完善 .Net Core 项目 — NLog入门 (日志组件) - 知乎 (zhihu.com)
二.使用
2.1 创建Nlog实例
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
2.2 配置
<targets>
<!--<target xsi:type="File" name="f"
fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message}" />-->
<target xsi:type="Console" name="console"/>
</targets>
<rules>
<!--<logger name="*" minlevel="Debug" writeTo="f" />-->
<logger name="*" minlevel="Info" writeTo="console"/>
</rules>
上面rules中存在两条规则
其中 在rules中添加Info, writeTo指向一个Console的目标
2.3 使用Debug进行输出
由于在Nlog.Config当中, 我们已经添加了Debug的最终输出目标, 所以我们尝试输出Debug的内容:
class Program
{
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
static void Main(string[] args)
{
Logger.Debug("我出现了意外!");
Console.ReadKey();
}
}
运行完成之后,可以在当前的输出目录中, 发生已经生成了一个logs的文件夹,并且生成了当前计算器日期的log文件 (这个规则在Nolog.Config当中可以进行配置), 如图所示:
2.4 使用Info输出
由于在Nlog.Config当中, 我们添加Info的最终输出目标为Console
2.5 例子
布局和布局渲染器
布局和布局渲染器 可以配置日志消息如何写入NLog targets.
下面展示了一个大多数 NLog targets 使用的简单布局方式 SimpleLayout
<target name="logfile" xsi:type="File" fileName="file.txt" layout="${longdate}|${level:uppercase=true}|${logger}|${message}" />
感觉添加模板会更清晰
<target name="console"
xsi:type="ColoredConsole"
layout="${longdate}|${level:uppercase=true}|${logger}|${message}"
useDefaultRowHighlightingRules="false">
<highlight-row condition="level == LogLevel.Debug" foregroundColor="DarkGray" />
<highlight-row condition="level == LogLevel.Info" foregroundColor="Gray" />
<highlight-row condition="level == LogLevel.Warn" foregroundColor="Yellow" />
<highlight-row condition="level == LogLevel.Error" foregroundColor="Red" />
<highlight-row condition="level == LogLevel.Fatal" foregroundColor="Red" backgroundColor="White" />
</target>
例子:
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
var name="莲花";
logger.Info($"name: {name} ...");
上文参考: