测量小百科 | NLog灵活免费的.NET开源日志记录
来源: | 作者:JYTEK | 发布时间: 2022-09-07 | 1824 次浏览 | 分享到:

关键词:NLog、日志记录、灵活、免费、.NET、开源


导读

我们在开发中经常需要记录程序或系统的操作状态以及追踪执行过程,以便快速的定位问题。

NLog是一个灵活且免费的日志平台,适用于各种.NET平台,包括.NET标准。NLog可写入多个目标(数据库、文件、控制台等),并即时更改日志记录配置。

NLog支持结构化和传统的日志记录,其主要特点有高性能、易于使用、易于扩展和灵活配置。

NLog官网地址:https://nlog-project.org/ 

NLog参考文档:https://github.com/NLog/NLog/wiki  

本期小百科介绍在C#编程时如何使用NLog来打印日志。


NLog的主要功能

1. 配置简单

NLog无论是通过配置文件还是以编程方式,配置都非常简单。即使不重新启动应用程序,也可以更改配置。

2. 可模板化

Nlog每条日志都可以使用各种布局渲染进行模板化。

3. 可拓展性

NLog 本身就自带数种数据记录的对象与数据输出的格式,不仅如此,还提供可自定义的数据记录目标与数据输出格式。

4. 结构化日志记录

NLog完全支持结构化日志记录并处理消息模板和自定义日志事件属性。

5. 可拓展Microsoft日志记录

NLog可以与Microsoft Extensible Logging(和ASP.NET Core)完全集成,而无需替换标准的 Microsoft LoggerFactory。NLog自动捕获LogEvent属性,并可以在结构化日志目标输出中使用它们。

6. appsettings.json

NLog配置可以从appsettings.json加载,作为NLog.config XML文件的替代方案。也可以使用 appsettings.json中的值和${configsetting}来配置NLog目标。

7. 支持多种记录跟踪信息的目标(target)

1) 文件;

2) 事件日志;

3) 数据库;

4) 文本控制台;

5) E-mail;

6) 调试器输出;

7) 还有一些包装器目标可以提供缓冲、负载平衡、故障转移情况、异步写入和许多其他场景等。

在配置选项页面上提供了完整的目标列表。如果没有找到满足需求的目标,用户可以很容易地编写一个定制的目标。

8. 支持多平台,例如

1) .NET 5 & 6 (.NET Standard 2.0);

2) .NET Framework 3.5 - 4.8;

3) .NET Core 1.0 - 3.1;

4) Xamarin Android + iOS (.NET Standard);

5) UWP (.NET Standard);

6) Mono 4;

7) ASP.NET Core (NLog.Web.AspNetCore package);

8) ASP.NET Classic (NLog.Web package)等。


NLog安装

1. 在Visual Studio中,可以通过NuGet下载安装NLog插件。

选中项目名称,右键后点击“管理NuGet程序包”(如图1),即可进入NuGet管理器。

图 1 点击“管理NuGet程序包”


2. 点击浏览,在搜索框中搜索“NLog”,分别安装图2中“Nlog”和“NLog.Config”,点击名称右侧的黑色箭头进行安装。


图 2 安装“Nlog和NLog.Config”


NLog示例

使用USB-61902进行单通道有限点采集,采样率设置为10000 (Sa/s),采样点数设置为20000,分别记录启动采集和结束采集的时刻。

1. 首先在代码顶端添加using

using NLog;


2. 点击项目中“NLog.config”

项目引入NLog.Config之后,会自动添加一个NLog.Config配置文件,程序运行的时候,会自动加载NLog.Config作为Nlog的配置。

打开该XML文件,其中有详细说明,targets配置输出目标,rules配置路由规则。

1) 全局配置 

1. <?xml version="1.0" encoding="utf-8" ?>  

2. <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"  

3.       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

4.       xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"  

5.       autoReload="true"  

6.       throwExceptions="false"  

7.       internalLogLevel="Off" internalLogFile="c:tempnlog-internal.log"> 

这是NLog.config的默认配置,一般不需要更改,其中autoReload:设置修改配置文件后是否允许自动加载无须重启程序;

  • autoReload:设置修改配置文件后是否允许自动加载无须重启程序;

  • throwExceptions:内部日志系统抛出异常;

  • internalLogLevel:可选Trace/Debug/Info/Warn/Error/Fatal决定内部日志的级别,Off为关闭;

  • internalLogFile:把内部的调试和异常信息都写入指定文件里


2) targets定义日志的输出目标

1.   <targets>  

2.     <target name="f"    

3.             xsi:type="File"  

4.             fileName="${basedir}/logs/${shortdate}.log"  

5.             layout="${longdate}| ${uppercase:${level}}| ${message}" />  

6.   </targets>  

targets中是对输出目标的配置,需要配置名称、输出类型、内容格式等,其中

  • name 是设置输出目标的名称;

  • xsi:type 是设置输出类型,其中File是文件类型;

  • fileName 是设置输出文件路径,其中${basedir}是相对路径,/logs是生成文件夹并命名为logs${shortdate}.log是以年月日日期生成log文件名称;

  • layout 是设置生成内容的格式,其中${longdate}是返回长时间格式,${uppercase:${level}}是返回当前日志的等级,${message}是用户设置的信息。


3) rules定义对日志信息的路由规则

1.   <rules>  

2.     <logger name="*" minlevel="Debug" writeTo="f" />  

3.   </rules> 

rules中是对日志路由顺序的配置,可以将日志分不同级别进行输出,不同级别的日志代表日志的重要程度,比如一些debug级别的日志在生产环境就会被控制不输出,以减少日志文件的大小。

  • minlevel 是设置日志的最小等级,Debug是日志等级中的一种

  • writeTo 是设置日志输出到target的目标,f为targets中配置的目标名称;

备注:日志级别有如下各种

a) Trace:最常见的记录信息,一般用于普通输出;

b) Debug:同样是记录信息,不过出现的频率要比Trace少一些,一般用来调试程序;

c) Info:信息类型的消息;

d) Warn:警告信息,一般用于比较重要的场合;

e) Error:错误信息;

f) Fatal:致命异常信息。一般来讲,发生致命异常之后程序将无法继续执行。


3. 完成对“NLog.config”的配置后,就可以在C#程序中直接完成对NLog的调用。

修改USB-61902单通道有限点采集范例。

1) 在aiTask开始任务时,打印日志记录下时间,参考代码如下:

1.                 //模拟输入任务开始  

2.                 aiTask.Start();  

3.   

4.                 //创建日志记录对象  

5.                 Logger Logger = LogManager.GetCurrentClassLogger();  

6.   

7.                 //打印日志  

8.                 Logger.Debug("USB-61902模拟输入任务开始_" + DateTime.Now);  


2) 在aiTask停止任务时,打印日志记录下时间,参考代码如下:

1.                 //模拟输入任务结束  

2.                 aiTask.Stop();  

3.   

4.                 //打印日志  

5.                 Logger.Debug("USB-61902模拟输入任务结束_" + DateTime.Now);


4. 运行程序后,即可在文件夹中查看到打印的日志信息,如图3:

图 3 log文件