无论是客户端程序、服务端程序还是游戏,日志在任何应用系统中都是十分重要的一个模块。.Net Core中,微软官方提供了Microsoft.Extensions.Logging
扩展,它提供了日志输出的接口,且能够和DI框架整合,使用非常简单。实际上,微软官方也提供了输出到控制台的实现Microsoft.Extensions.Logging.Console
,但其功能比较简陋,具体输出日志时目前比较常用的框架是NLog。
虽然NLog也能单独使用,但这里还是建议结合微软官方的Logging扩展使用,Logging扩展作为接口,NLog作为实现(两者类似于Java的SLF4J和Logback的关系),这样能够提高我们代码的抽象程度,即使后期要更换日志框架,也不会因为和NLog过度的耦合而导致无法实现。
这篇笔记我们介绍Logging扩展的使用,以及简单介绍如何使用NLog。
在使用日志框架前,我们需要使用NuGet安装微软官方提供的Logging扩展和NLog包。
Install-Package Microsoft.Extensions.Logging
Install-Package NLog.Extensions.Logging
微软官方的Logging框架有如下日志级别:Trace
、Debug
、Information
、Warning
、Error
、Critical
,代表的日志严重程度按顺序递增。
不过这里要注意的是NLog框架也有自己的一套日志级别,其顺序为:Trace
、Debug
、Info
、Warn
、Error
、Fatal
,虽然起的名字略有不同,但和微软官方是完全对应的。
这里我们直接在控制台项目中搭建工程,以一个简单的例子,演示如何在DI框架下使用Logging扩展输出日志。
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">
<targets>
<target name="Console" xsi:type="ColoredConsole" layout="${longdate} [${threadname:whenEmpty=${threadid}}] ${level} ${logger} - ${message} ${newline} ${exception:format=ToString,StackTrace}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="Console" />
</rules>
</nlog>
nlog.config
是配置NLog输出目标、过滤规则、输出格式等的配置文件,我们这里实现了一个最简单的控制台日志输出,其中内容我们就不展开介绍了,具体可以参考NLog相关章节。
DemoService.cs
using Microsoft.Extensions.Logging;
namespace Gacfox.Demo.DemoNetCore
{
public class DemoService
{
private readonly ILogger<DemoService> logger;
public DemoService(ILogger<DemoService> logger)
{
this.logger = logger;
}
public void Foo()
{
logger.LogInformation("开始同步数据");
try
{
throw new ApplicationException();
}
catch (Exception ex)
{
logger.LogError(ex, "数据同步失败");
}
logger.LogInformation("同步结束");
}
}
}
DemoService
是我们创建的一个服务类,它由IoC容器管理,我们在构造方法中声明注入ILogger
对象,ILogger
提供了对应日志级别的一系列输出方法,可以调用该对象中的方法来记录日志。Foo()
方法中,我们分别演示了输出INFO和ERROR级别的日志,以及如何输出异常栈。
Program.cs
using Microsoft.Extensions.DependencyInjection;
using NLog.Extensions.Logging;
namespace Gacfox.Demo.DemoNetCore
{
class Program
{
static void Main()
{
IServiceCollection collection = new ServiceCollection();
collection
.AddLogging(builder =>
{
builder.AddNLog();
})
.AddTransient<DemoService>();
using (ServiceProvider serviceProvider = collection.BuildServiceProvider())
{
DemoService demoService = serviceProvider.GetRequiredService<DemoService>();
demoService.Foo();
}
}
}
}
在最外层的Program.cs
中,我们首先初始化了DI框架,然后调用了AddLogging()
方法,其参数是一个Lambda表达式,内部使用了一个日志配置的构建器,我们在其中指定使用NLog输出日志。此时,我们从IoC容器中获取DemoService
,并调用相关方法,即可在控制台上看到相关的日志输出。