分享一个 .NET Core Console 项目中应用 NLog 写日志的详细例子

前言

日志在软件开发中扮演着非常重要的角色,通常我们用它来记录应用程序运行时发生的事件、错误信息、警告以及其他相关信息,帮助在调试和排查问题时更快速地定位和解决 Bug。

通过日志,我们可以做到:

  1. 故障排除和调试:帮助追踪程序的运行情况,定位问题并进行故障排除。

  2. 性能监控:通过日志记录关键性能指标,可以很方便地监控程序的性能并进行优化。

  3. 安全性:记录潜在的安全问题,帮助及时发现并解决安全漏洞。

  4. 审计和合规性:记录程序的行为,追踪用户的操作记录,确保操作合规性。

NLog 是一个流行的开源日志记录库,用于 .NET 平台的应用程序,可以通过配置文件或代码进行配置,支持多种日志输出方式,如文件、数据库、控制台、网络等,在不影响应用程序性能的情况下进行日志记录,是 .NET 程序员的好助手。

今天分享一个在 .NET Core Console 项目中如果配置和应用 NLog 写日志的详细例子。

Step By Step 步骤

  1. 下载 Nuget 包

    Microsoft.Extensions.DependencyInjection
    NLog.Extensions.Logging
    
  2. 添加 nlog.config 文件,并设置 复制到输出目录-如果较新则复制

    内容见《附录:NLog.config 内容》

  3. 在 Program.cs 注入 NLog 服务(留意注释

    c# 复制代码
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Logging;
    using NLog.Extensions.Logging;
    
    // 注入 NLog 服务
    services.AddLogging(loggingBuilder => {
    	loggingBuilder.ClearProviders();
    	loggingBuilder.SetMinimumLevel(LogLevel.Information);
    	loggingBuilder.AddNLog();
    });
  4. 新建一个 NetUtil.cs(留意注释

    c# 复制代码
    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.");
    		}
    	}
    }
  5. 在 Program.cs 调用 NetUtil 中的方法(留意注释

    c# 复制代码
    // 注入 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();
    	}
    }
  6. 运行程序,即可在程序输出目录如 Debug 中 logs 目录看到生成的日志文件

附录:完整的 Program.cs 代码

c# 复制代码
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 怎么样呢?欢迎留言讨论。

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊人生。

都看到这了,求个点赞、关注、在看三连呗,感谢支持。

相关推荐
小兜全糖(xdqt)3 小时前
.netCore WebAPI中字符串加密与解密
.netcore
沪上百卉3 小时前
.NET Core 常用的三个生命周期
.netcore
Envyᥫᩣ3 小时前
C#语言:从入门到精通
开发语言·c#
IT技术分享社区9 小时前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
△曉風殘月〆16 小时前
WPF MVVM入门系列教程(二、依赖属性)
c#·wpf·mvvm
逐·風18 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
m0_6569747421 小时前
C#中的集合类及其使用
开发语言·c#
九鼎科技-Leo21 小时前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
九鼎科技-Leo1 天前
什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
windows·后端·c#·asp.net·mvc·.net
.net开发1 天前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf