前言
日志在软件开发中扮演着非常重要的角色,通常我们用它来记录应用程序运行时发生的事件、错误信息、警告以及其他相关信息,帮助在调试和排查问题时更快速地定位和解决 Bug。
通过日志,我们可以做到:
-
故障排除和调试:帮助追踪程序的运行情况,定位问题并进行故障排除。
-
性能监控:通过日志记录关键性能指标,可以很方便地监控程序的性能并进行优化。
-
安全性:记录潜在的安全问题,帮助及时发现并解决安全漏洞。
-
审计和合规性:记录程序的行为,追踪用户的操作记录,确保操作合规性。
NLog 是一个流行的开源日志记录库,用于 .NET 平台的应用程序,可以通过配置文件或代码进行配置,支持多种日志输出方式,如文件、数据库、控制台、网络等,在不影响应用程序性能的情况下进行日志记录,是 .NET 程序员的好助手。
今天分享一个在 .NET Core Console 项目中如果配置和应用 NLog 写日志的详细例子。
Step By Step 步骤
-
下载 Nuget 包
Microsoft.Extensions.DependencyInjection NLog.Extensions.Logging
-
添加 nlog.config 文件,并设置 复制到输出目录-如果较新则复制
内容见《附录:NLog.config 内容》
-
在 Program.cs 注入 NLog 服务(留意注释)
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using NLog.Extensions.Logging; // 注入 NLog 服务 services.AddLogging(loggingBuilder => { loggingBuilder.ClearProviders(); loggingBuilder.SetMinimumLevel(LogLevel.Information); loggingBuilder.AddNLog(); });
-
新建一个 NetUtil.cs(留意注释)
using Microsoft.Extensions.Logging; class NetUtil { private readonly ILogger<NetUtil> logger; // 构造方法注入 IOptionsSnapshot public NetUtil(ILogger<NetUtil> logger) { this.logger = logger; } // 在方法中写日志内容 public async Task Test() { try { logger.LogInformation("Starting get data...."); } catch (Exception ex) { logger.LogError(ex, "Error occurred when getting dashboard data."); } } }
-
在 Program.cs 调用 NetUtil 中的方法(留意注释)
// 注入 NetUtil 类 services.AddScoped<NetUtil>(); // 调用 NetUtil 类方法,里面有调用 NLog 方法 using (var sp = services.BuildServiceProvider()) { // 建立了一个无限循环 using (var scope = sp.CreateScope()) { var spScope = scope.ServiceProvider; var demo = spScope.GetRequiredService<NetUtil>(); await demo.Test(); } }
-
运行程序,即可在程序输出目录如 Debug 中 logs 目录看到生成的日志文件
附录:完整的 Program.cs 代码
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
// 注入 NLog 服务
services.AddLogging(loggingBuilder => {
loggingBuilder.ClearProviders();
loggingBuilder.SetMinimumLevel(LogLevel.Information);
loggingBuilder.AddNLog();
});
// 注入 NetUtil 类
services.AddScoped<NetUtil>();
// 调用 NetUtil 类方法,里面有调用 NLog 方法
using (var sp = services.BuildServiceProvider())
{
using (var scope = sp.CreateScope())
{
var spScope = scope.ServiceProvider;
var demo = spScope.GetRequiredService<NetUtil>();
await demo.Test();
}
}
附录: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"
autoReload="true"
internalLogLevel="Warn"
internalLogFile="internal-nlog.txt">
<!-- define various log targets -->
<targets>
<!-- write logs to file -->
<target xsi:type="File" name="allfile" fileName="logs/nlog-all-${shortdate}.log"
layout="${longdate} ${uppercase:${level}} [${logger}] ${message} ${exception}"
maxArchiveDays="3"
maxArchiveFiles="10" />
<target xsi:type="File" name="ownFile-web" fileName="logs/nlog-info-${shortdate}.log"
layout="${longdate} ${uppercase:${level}} [${logger}] ${message} ${exception}"
maxArchiveDays="3"
maxArchiveFiles="10" />
<target xsi:type="Null" name="blackhole" />
</targets>
<rules>
<!--Skip Microsoft logs and so log only own logs-->
<logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
<!--All logs, including from Microsoft-->
<logger name="*" minlevel="Trace" writeTo="allfile" />
<logger name="*" minlevel="Info" writeTo="ownFile-web" />
</rules>
</nlog>
最后
通过使用 NLog 这样的日志记录库,我们可以更轻松地实现日志记录功能,提高应用程序的可靠性和可维护性。
您觉得 NLog 怎么样呢?欢迎留言讨论。
我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊人生。
都看到这了,求个点赞、关注、在看三连呗,感谢支持。