编程语言
首页 > 编程语言> > ASP.NET Core引入第三方日志框架及简单实现日志策略配置

ASP.NET Core引入第三方日志框架及简单实现日志策略配置

作者:互联网

引言

在我们项目开发的过程中,使用.NET 6自带的日志系统有时是不能满足实际需求的,比如有的时候我们需要将日志输出到第三方平台上,最典型的应用就是在各种云平台上,为了集中管理日志和查询日志,通常会选择对应平台的日志SDK进行集成。比如微软Azure提供的Azure App Service Logging,基础的用法可以参考这篇文章:ASP.NET Core Logging with Azure App Service and Serilog。同时在这篇文章中也提到了使用Serilog提供的多种Sink,可以实现将日志写入不同云平台或者是非云平台的日志存储中去,这是我们这篇文章讲要研究的内容。

原理和思路

查阅Serilog的官方文档和一些示例后确定,我们要做的事情有这么几件:

  1. 引入Serilog.AspNetCore包(很多文章或者教程里都让你根据需要使用的Sink去继续引入类似Serilog.Sink.File之类的包,但是实际上Serilog.AspNetCore包的依赖项里已经包含了File这个Sink,所以实际上没有必要再去添加一次);
  2. 二是需要为SerilogLogger对象提供一个LoggerConfiguration,可以以代码的方式进行配置,也可以通过加载.json文件的方式进行配置,看自己的需求和对配置热更新的有没有独特的要求决定;
  3. 在程序启动构造WebApplicationBuilder对象的时候声明UseSerilog()
  4. 在需要使用日志的地方注入ILogger<T>对象即可,我们一般是在构造函数里进行注入,当然也可以选择其他两种注入方式。

实现

  1. 引入Serilog包

    Install-Package Serilog.AspNetCore

  2. 创建日志配置文件,以便于在Progrom中注入日志框架到容器中

    public static class ConfigureLogProvider
        {
            public static void ConfigureLog(this WebApplicationBuilder builder)
            {
                if (builder.Configuration.GetValue<bool>("UseFileToLog"))
                {
                    // 配置同时输出到控制台和文件,并且指定文件名和文件转储方式(形如log-20220110.txt格式),转储文件保留的天数为15天,以及日志格式
                    // 配置Enrich.FromLogContext()的目的是为了从日志上下文中获取一些关键信息诸如用户ID或请求ID。
                    Serilog.Log.Logger = new LoggerConfiguration()
                        .Enrich.FromLogContext()
                        .WriteTo.Console()
                        .WriteTo.File(
                        $"{builder.Configuration.GetValue<string>("LogFilePath")}/.txt",
                        outputTemplate: "{{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}}",
                        rollingInterval: RollingInterval.Day,
                        retainedFileCountLimit: 15)
                        .CreateLogger();
                }
                else {
                    Serilog.Log.Logger = new LoggerConfiguration()
                        .Enrich.FromLogContext()
                        .WriteTo.Console()
                        .CreateLogger();
                }
    
                // 使用Serilog作为日志框架,注意这里和.NET 5及之前的版本写法是不太一样的。
                builder.Host.UseSerilog();
            }
        }
    
  3. Program中注入服务

    Tips:.NET6之前没有顶级代码这个特性,应在StartUp中注入

    using TodoList.Infrastructure.Log;
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    //配置日志
    builder.ConfigureLog();
    
    builder.Services.AddControllers();
    
    .....
    
  4. 配置日志文件输出路径及日志输出方式

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "UseFileToLog": true,
      "LogFilePath": "./bin/logs"
    }
    

    在日志策略方法中我们是在appsettings.Development.json这个配置文件中取值的,所以这里需要配置一下,这里只是打个比方。

    image-20220110231003023

  5. 最后在代码中尽情使用吧

    image-20220110231207791

  6. 验证一下

    控制台输出:

    image-20220110231415851

    文件输出:

    image-20220110231335380

代码

https://github.com/luchong0813/TodoList

标签:Core,ASP,Serilog,builder,配置,Sink,日志,AspNetCore
来源: https://www.cnblogs.com/chonglu/p/15786461.html