Logging 日志框架

无论是客户端程序、服务端程序还是游戏,日志在任何应用系统中都是十分重要的一个模块。.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框架有如下日志级别:TraceDebugInformationWarningErrorCritical,代表的日志严重程度按顺序递增。

不过这里要注意的是NLog框架也有自己的一套日志级别,其顺序为:TraceDebugInfoWarnErrorFatal,虽然起的名字略有不同,但和微软官方是完全对应的。

Logging日志框架使用

这里我们直接在控制台项目中搭建工程,以一个简单的例子,演示如何在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,并调用相关方法,即可在控制台上看到相关的日志输出。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap