NLog接入配置与简单使用

卷儿哥 2023年11月28日 536次浏览

NLog是一个基于.NET平台编写的日志记录类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码。可以在任何一种.NET语言中输出带有上下文的(contextual information)调试诊断信息,根据喜好配置其表现样式之后发送到一个或多个输出目标(target)中

1. 安装NLog

打开Visual Studio中的包管理器,路径: 工具 -> NuGet包管理器 -> 管理解决方案的NuGet包 ,在浏览中搜索NLog,点击后进行安装。(如果已经安装,跳过该步骤)

2. 添加NLog配置

有两种方式添加NLog配置:1、通过代码进行添加;2、通过配置文件进行添加。

2.1 通过配置文件添加配置的方法
  • 右键解决方案,选择添加新项,选择应用程序配置文件,名称为”NLog.config”(名称必须为NLong.config)。
  • 右键“NLog.config”文件,选择属性,将复制到输出目录设置为“如果较新则复制”。
  • 在“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"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
	<variable name="appName" value="ConsoleAppDemo"/>
	<targets>
		<target name="logconsole" xsi:type="Console"
				layout="${longdate} [${uppercase:${level}}] ${callsite}(${callsite-filename:includeSourcePath=False}:${callsite-linenumber}) - ${message} ${exception:format=ToString}" />
		<target name="logfile" 
				xsi:type="File" 
				fileName="${basedir}/logs/${appName}-${shortdate}.log"
				layout="${longdate} [${uppercase:${level}}] ${callsite}(${callsite-filename:includeSourcePath=False}:${callsite-linenumber}) - ${message} ${exception:format=ToString}"
				maxArchiveFiles="999"
archiveFileName="${basedir}/logs/${appName}-${shortdate}-${###}.log"
				createDirs="true"
				archiveAboveSize="102400"
				archiveEvery="Day"
				encoding="UTF-8"
		/>
	</targets>
	<rules>
		<logger name="*" minlevel="Debug" writeTo="logfile" />
	</rules>
</nlog>

定义了输出日志文件的名称开通,value=”ConsoleAppDemo”的内容可以自行进行修改
中定义了日志输出的方式以及输出格式
xsi:type指定输出方式,“Console”表示输出到控制台,“File”表示输出到文件
fileName输出的文件路径和文件名称,${basedir}表示程序运行目录,可以自行指定
layout指定了日志输出的格式
maxArchiveFiles 最大备份文件个数
archiveFileName 备份文件路径和名称
createDirs 是否自动创建目录
archiveAboveSize 日志滚动备份的大小
archiveEvery 日志滚动备份的频率
encoding 日志文件编码格式
定义了命名空间以及日志级别的输出方式 ,一般有如下几个属性:
name - 日志源/记录者的名字 (允许使用通配符*)
minlevel - 匹配日志范围的最低级别
maxlevel - 匹配日志范围的最高级别
level - 匹配的单一日志级别
levels - 匹配的一系列日志级别,由逗号分隔。
writeTo - 规则匹配时日志应该被写入的一系列目标节点的name属性,由逗号分隔。
final - 标记当前规则为最后一个规则。其后的规则即时匹配也不会被运行

<logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" /> - 名字空间Name.Space下的Class1这个类的所有级别等于或者高于Debug的日志信息都写入到“f1”这个目标里。
<logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" /> -名字空间Name.Space下的Class1这个类的所有级别等于Debug或Error的日志信息都写入到“f1”这个目标里。
<logger name="Name.Space.*" writeTo="f3,f4" /> -名字空间Name.Space下所有类的所有级别的日志信息都写入到“f3”和“f4”这两个目标里。
<logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" /> - 名字空间Name.Space下所有类的、级别在Debug和Error之间的(包括Debug,Info,Warn,Error) 日志信息都不会被记录(因为这条规则没有定义writeTo),同时其它后续规则也都会被忽略(因为这里设置了final="true")。

NLog支持如下几种记录等级(优先级:Trace→Debug→Info→Warn→Error→Fatal):

  • Trace最常见的记录信息,一般用于普通输出
  • Debug同样是记录信息,不过出现的频率要比Trace少一些,一般用来调试程序
  • Info信息类型的消息
  • Warn警告信息,一般用于比较重要的场合
  • Error错误信息
  • Fatal致命异常信息。一般来讲,发生致命异常之后程序将无法继续执行。
  • 文件添加了之后,NLog就配置好了
    注:修改NLog.config之后,需要重新生成解决方案
2.2 代码实现
//创建一个配置文件对象
var config = new NLog.Config.LoggingConfiguration();
//创建日志写入目的地
var logfile = new NLog.Targets.FileTarget("logfile") { FileName = $"logs/{DateTime.Now.ToString("yyyy-MM-dd")}.txt" };
//添加日志路由规则
config.AddRule(LogLevel.Debug, LogLevel.Fatal, logfile);
//配置文件生效
LogManager.Configuration = config;
//创建日志记录对象方式1
Logger Logger = LogManager.GetCurrentClassLogger();
//创建日志记录对象方式2,手动命名
Logger Logger2 = LogManager.GetLogger("MyLogger");
//打出日志
Logger.Debug("我打出了Nlog日志!");

3. 写入日志

NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
logger.Debug("my first log");

GetCurrentClassLogger: 获取当前的类。

在上面的配置文件中,Debug及以上等级的日志输出到basedir/logs/{basedir}/logs/{appName}-${shortdate}.log 文件中,在该工程的bin\Debug\net6.0\logs 目录下,生成了“ConsoleAppDemo-2023-02-23.log”日志文件。

文件中的内容:

2023-02-23 22:32:03.5586 [DEBUG] Program.<Main>$(Program.cs:7) - my first log

在类中使用
在每个需要写日志的类中,定义静态的private logger,用来日志输出。

private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

之后就可以在类的方法中使用logger进行日志输出,常用的输出级别:

logger.Debug()
http://logger.Info()
logger.Warn()
logger.Error()

输出方式举例

namespace ConsoleAppDemo.src.module.demo
{
    internal class DemoOne
    {
        private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
        public void LogDemo(string msg)
        {
            try
            {
                logger.Debug("this is debug log");
                logger.Info("this is info log");
                logger.Warn("this is waring log");
                logger.Error("this is error log");
                logger.Info("the input is {0}", msg);
                throw new Exception("LogDemo 出现异常");
            } 
            catch (Exception e) {
                logger.Error("LogDemo出错: {0}", e);
            }
        }
    }
}

运行后,日志文件中的日志内容如下:

2023-02-23 22:42:03.0395 [DEBUG] ConsoleAppDemo.src.module.demo.DemoOne.LogDemo(DemoOne.cs:17) - this is debug log 
2023-02-23 22:42:03.0413 [INFO] ConsoleAppDemo.src.module.demo.DemoOne.LogDemo(DemoOne.cs:18) - this is info log 
2023-02-23 22:42:03.0413 [WARN] ConsoleAppDemo.src.module.demo.DemoOne.LogDemo(DemoOne.cs:19) - this is waring log 
2023-02-23 22:42:03.0413 [ERROR] ConsoleAppDemo.src.module.demo.DemoOne.LogDemo(DemoOne.cs:20) - this is error log 
2023-02-23 22:42:03.0413 [INFO] ConsoleAppDemo.src.module.demo.DemoOne.LogDemo(DemoOne.cs:22) - the input is ooooo 
2023-02-23 22:42:03.0413 [ERROR] ConsoleAppDemo.src.module.demo.DemoOne.LogDemo(DemoOne.cs:24) - LogDemo出错: System.Exception: LogDemo 出现异常
  at ConsoleAppDemo.src.module.demo.DemoOne.LogDemo(String msg) in \\\\Mac\\Home\\Desktop\\work\\myself\\code\\win11\\csharp\\ConsoleAppDemo\\src\\module\\demo\\DemoOne.cs:line 24