• NLog笔记


    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.

    NLog (nlog-project.org)

    一.配置

    使用NuGet添加NLog

    NLog 支持两种文件格式:

    1. 在标准的 *.exe.config 或 web.config 中嵌入配置
    2. 在单独的文件中进行配置

    NLog 配置文件是一个以 nlog 为根节点的 XML 文件。nlog 节点可以添加命名空间,以开启 Visual Studio 的 Intellisense 功能。

    1. <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    3. </nlog>

    以下元素可以作为 nlog 节点的子节点,前两种元素在所有 NLog 配置文件中都必须存在,剩余元素是可选的。

    • targets - 定义日志目标/输出
    • rules - 定义日志路由规则
    • extensions - 定义要加载的 NLog 扩展项 *.dll 文件
    • includes - 定义要包含的外部配置文件
    • variables - 设置配置变量的值

    在 nlog 节点中设置属性autoReload="true",NLog 会监视配置文件,并在配置文件发生更改时自动重新载入配置文件而不需要重启应用程序。该功能支持通过 include 包含的子配置文件。示例如下,

    1. <nlog autoReload="true">
    2. ...
    3. </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 节点的例子:

    1. <targets>
    2. <target name="f1" xsi:type="File" fileName="file1.txt"/>
    3. <target name="f2" xsi:type="File" fileName="file2.txt"/>
    4. <target name="n1" xsi:type="Network" address="tcp://localhost:4001"/>
    5. <target name="ds" xsi:type="OutputDebugString"/>
    6. </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 - 使能当前规则

    如果在一条规则中定义了多个日志等级相关的属性(levellevelsminLevel 和 maxLevel),按照优先级只生效当前优先级最高的属性。等级相关属性优先级如下,

    1. level
    2. levels
    3. minLevel 和 maxLevel
    4. 没有设置(所有等级的日志都会被记录)

    以下是 rules 节点的例子

    1. <rules>
    2. <logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" />
    3. <logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" />
    4. <logger name="Name.Space.*" writeTo="f3,f4" />
    5. <logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" />
    6. </rules>
    1. 命名空间 Name.Space 下类 Class1 中高于 Debug 级别的日志信息将被写入输出目标 f1
    2. 命名空间Name.Space 下类 Class1 中级别为 Debug 和 Error 的日志信息将被写入 target:f1
    3. 命名空间 Name.Space 下所有类中的日志信息将被写入 target:f3, f4
    4. 命名空间 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 。示例如下,

    1. <nlog>
    2. <extensions>
    3. <add assembly="MyAssembly" />
    4. </extensions>
    5. <targets>
    6. <target name="a1" type="MyFirst" host="localhost" />
    7. </targets>
    8. <rules>
    9. <logger name="*" minLevel="Info" appendTo="a1" />
    10. </rules>
    11. </nlog>

    NLog 4.0 之后,与 NLog.dll 同目录下名如 NLog*.dll 的程序集(如 NLog.CustomTarget.dll)会被自动加载。

    1.4 Includes

    include 节点指定当前配置文件包含多个子配置文件,语法为 。通过 ${} 语法可以使用环境变量,下例展示包含一个名为当前机器名的配置文件。

    1. <nlog>
    2. ...
    3. <include file="${machinename}.config" />
    4. ...
    5. </nlog>

    NLog 4.4.2 之后可以使用通配符 * 指定多个文件。例如,

    (5) Variables

    variable 元素定义了配置文件中需要用到的变量,一般用来表示复杂或者重复的表达式(例如文件名)。变量需要先定义后使用,否则配置文件将初始化失败。定义变量的语法如下:

    <variable name="var" value="xxx" />

    定义变量之后,可以通过 ${var} 语法来使用:1

    以上参考:

    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 配置

    1. "Console" name="console"/>
    2. "*" minlevel="Info" writeTo="console"/>

    上面rules中存在两条规则

    其中 在rules中添加Info, writeTo指向一个Console的目标

    2.3 使用Debug进行输出

    由于在Nlog.Config当中, 我们已经添加了Debug的最终输出目标, 所以我们尝试输出Debug的内容:

    1. class Program
    2. {
    3. private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
    4. static void Main(string[] args)
    5. {
    6. Logger.Debug("我出现了意外!");
    7. Console.ReadKey();
    8. }
    9. }

    运行完成之后,可以在当前的输出目录中, 发生已经生成了一个logs的文件夹,并且生成了当前计算器日期的log文件 (这个规则在Nolog.Config当中可以进行配置), 如图所示:

     

     

     2.4 使用Info输出

    由于在Nlog.Config当中, 我们添加Info的最终输出目标为Console

     

     2.5 例子

    布局和布局渲染器

    布局和布局渲染器 可以配置日志消息如何写入NLog targets.

    下面展示了一个大多数 NLog targets 使用的简单布局方式 SimpleLayout 

    "logfile" xsi:type="File" fileName="file.txt" layout="${longdate}|${level:uppercase=true}|${logger}|${message}" />

    感觉添加模板会更清晰

    1. "console" 
    2.             xsi:type="ColoredConsole" 
    3.             layout="${longdate}|${level:uppercase=true}|${logger}|${message}"
    4.             useDefaultRowHighlightingRules="false">
    5.       "level == LogLevel.Debug" foregroundColor="DarkGray" />
    6.       "level == LogLevel.Info" foregroundColor="Gray" />
    7.       "level == LogLevel.Warn" foregroundColor="Yellow" />
    8.       "level == LogLevel.Error" foregroundColor="Red" />
    9.       "level == LogLevel.Fatal" foregroundColor="Red" backgroundColor="White" />
    10.    

     例子

    1. private static readonly Logger logger = LogManager.GetCurrentClassLogger();
    2. var name="莲花";
    3. logger.Info($"name: {name} ...");

    上文参考:

    NLog 教程 - 简书 (jianshu.com)

  • 相关阅读:
    FreeRTOS入门教程(队列详细使用示例)
    Docker从认识到实践再到底层原理(六-1)|Docker容器基本介绍+命令详解
    蓝桥杯实战应用【算法知识篇】-分治法介绍及关键点解析
    C# 第三方曲线库及其特点
    云原生Kubernetes:K8S常用服务端口
    P8196 [传智杯 #4 决赛] 三元组
    基于VUE + Echarts 实现可视化数据大屏快递业务数据
    Mysql联合索引和最左匹配例子说明
    Leetcode 1089. 复写零
    创建型模式 - 简单工厂模式StaticFactoryMethod
  • 原文地址:https://blog.csdn.net/hellolianhua/article/details/126502908