C# NLog
最后修改于 2023 年 7 月 5 日
在本文中,我们将展示如何使用 NLog 库在 C# 中进行日志记录。
NLog 是一个免费的 .NET 日志库。 它易于使用、性能良好且可扩展。
$ dotnet add package NLog
我们将包添加到项目中。
日志记录
日志记录 是将信息写入日志目标的过程。 记录的数据包括有关操作系统、软件或通信中发生的各种事件的信息。
记录信息的原因是
- 信息收集
- 故障排除
- 生成统计信息
- 审计
- 性能分析
除了识别软件开发中的错误之外,日志记录还用于检测安全事件、监控策略违规、在出现问题时提供信息、查找应用程序瓶颈或生成使用数据。
日志级别
日志级别指示消息优先级。
- Off - 日志记录已关闭
- Trace - 非常详细和嘈杂,最冗长的级别
- Debug - 细节较少,用于感兴趣的内部事件
- Info - 信息性消息
- Warn - 关于可以恢复的验证问题或临时故障的警告;可能表明未来的问题
- Error - 更严重的错误消息,表明数据或功能丢失
- Fatal - 最关键的消息,应用程序经常终止
目标
日志目标是存储日志信息的目标位置。
NLog 支持许多目标,包括
- 文件
- 控制台
- 电子邮件地址
- 数据库
- 消息队列
- 远程计算机
- 远程服务
- 应用
布局
布局定义了以何种格式记录何种信息。
${longdate}|${level:uppercase=true}|${logger}|${message:withexception=true}
这是默认布局。
NLog ConsoleTarget
使用 ConsoleTarget 时,消息将写入控制台。
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 布局示例
在下一个示例中,我们选择自定义日志布局。
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,我们将日志消息写入文件。
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 规则
日志规则控制消息如何写入目标。
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 库在 C# 中完成了日志记录。
作者
列出所有 C# 教程。