ZetCode

C# NLog

最后修改于 2023 年 7 月 5 日

在本文中,我们将展示如何使用 NLog 库在 C# 中进行日志记录。

NLog 是一个免费的 .NET 日志库。 它易于使用、性能良好且可扩展。

$ dotnet add package NLog

我们将包添加到项目中。

日志记录

日志记录 是将信息写入日志目标的过程。 记录的数据包括有关操作系统、软件或通信中发生的各种事件的信息。

记录信息的原因是

除了识别软件开发中的错误之外,日志记录还用于检测安全事件、监控策略违规、在出现问题时提供信息、查找应用程序瓶颈或生成使用数据。

日志级别

日志级别指示消息优先级。

目标

日志目标是存储日志信息的目标位置。

NLog 支持许多目标,包括

布局

布局定义了以何种格式记录何种信息。

${longdate}|${level:uppercase=true}|${logger}|${message:withexception=true}

这是默认布局。

NLog ConsoleTarget

使用 ConsoleTarget 时,消息将写入控制台。

Program.cs
using NLog;
using NLog.Targets;

var target = new ConsoleTarget();

NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Info);

Logger logger = LogManager.GetLogger("simple");
logger.Debug("debug message");
logger.Info("info message");
logger.Error("error message");

该示例将消息记录到控制台。

var target = new ConsoleTarget();

创建了一个新的控制台目标。

NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Info);

此行配置 NLog 以记录到指定目标,以便输出高于或等于指定级别的所有消息。

Logger logger = LogManager.GetLogger("simple");

我们创建一个命名的记录器。

logger.Debug("debug message");
logger.Info("info message");
logger.Error("error message");

我们使用不同的日志级别记录三个消息。

$ dotnet run
2023-03-30 17:33:50.5430|INFO|simple|info message
2023-03-30 17:33:50.5656|ERROR|simple|error message

由于 Debug 级别低于 Info 级别,因此不会为此目标记录它。

NLog 布局示例

在下一个示例中,我们选择自定义日志布局。

Program.cs
using NLog;
using NLog.Targets;

var target = new ColoredConsoleTarget();
target.Layout = "${date:format=yy-MM-dd HH\\:MM\\:ss} ${logger} ${message}";

NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Debug);

Logger logger = LogManager.GetLogger("simple");
logger.Debug("debug message");
logger.Info("info message");
logger.Error("error message");

我们定义了一个带有自定义布局的彩色控制台目标。

target.Layout = "${date:format=yy-MM-dd HH\\:MM\\:ss} ${logger} ${message}";

在布局中,我们包括一个自定义格式化的日期、记录器的名称和消息。

NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Debug);

Logger logger = LogManager.GetLogger("simple");
logger.Debug("debug message");
logger.Info("info message");
logger.Error("error message");

由于日志级别设置为 Debug,因此会记录所有三个消息。

NLog FileTarget

使用 FileTarget,我们将日志消息写入文件。

Program.cs
using NLog;
using NLog.Targets;

var target = new FileTarget();
target.FileName = "${basedir}/output.log";

NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Info);

Logger logger = LogManager.GetLogger("simple");
logger.Info("info message");
logger.Error("error message");

该示例将两个消息写入文件目标。

var target = new FileTarget();
target.FileName = "${basedir}/output.log";

我们创建一个新的 FileTarget 并定义日志文件名。

NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Info);

Logger logger = LogManager.GetLogger("simple");
logger.Info("info message");
logger.Error("error message");

我们配置目标并写入两个消息。

$ cat bin\Debug\net7.0\output.log
2023-03-30 18:15:38.5713|INFO|simple|info message
2023-03-30 18:15:38.5905|ERROR|simple|error message

NLog 规则

日志规则控制消息如何写入目标。

Program.cs
using NLog;
using NLog.Targets;
using NLog.Config;

var config = new LoggingConfiguration();

var ftarget = new FileTarget();
ftarget.FileName = "${basedir}/output.log";
config.AddTarget("file", ftarget);

var ctarget = new ConsoleTarget();
config.AddTarget("console", ctarget);

var rule = new LoggingRule("error", LogLevel.Error, ftarget);
config.LoggingRules.Add(rule);

var rule2 = new LoggingRule("*", LogLevel.Info, ctarget);
config.LoggingRules.Add(rule2);

LogManager.Configuration = config;

Logger logger = LogManager.GetLogger("simple");
logger.Info("info message");
logger.Error("error message");

Logger logger2 = LogManager.GetLogger("error");
logger2.Info("info message 2");
logger2.Error("error message 2");

我们有两个目标:一个文件目标和一个控制台目标。这两个规则定义了消息如何到达目标。

var rule = new LoggingRule("error", LogLevel.Error, ftarget);
config.LoggingRules.Add(rule);

第一个规则具有错误名称模式并转到文件目标。

var rule2 = new LoggingRule("*", LogLevel.Info, ctarget);
config.LoggingRules.Add(rule2);

第二个规则被赋予 * 作为名称模式,并绑定到控制台目标。

Logger logger = LogManager.GetLogger("simple");
logger.Info("info message");
logger.Error("error message");

Logger logger2 = LogManager.GetLogger("error");
logger2.Info("info message 2");
logger2.Error("error message 2");

写入四个消息。

$ dotnet run 
2023-03-30 18:38:29.3712|INFO|simple|info message
2023-03-30 18:38:29.3818|ERROR|simple|error message
2023-03-30 18:38:29.3818|INFO|error|info message 2
2023-03-30 18:38:29.3818|ERROR|error|error message 2
$ cat bin\Debug\net7.0\output.log
2023-03-30 18:38:29.3818|ERROR|error|error message 2

所有四个消息都被记录到控制台,因为它们满足第一个规则。 只有一个消息满足第二个规则,该规则绑定到文件日志。

来源

NLog 文档页面

在本文中,我们已经使用 NLog 库在 C# 中完成了日志记录。

作者

我叫 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程