• 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

  • 相关阅读:
    Redis12:客户端
    Redis11:事件
    Redis10:RDB持久化与AOF持久化
    Redis09:过期时间与删除策略、redis中的特殊线程
    Redis08:redis中的对象与存储形式
    Redis07:底层:基数树radix tree
    Redis06:底层:跳跃链表skiplist
    C++基础知识:异常处理
    C++基础知识:STL简介
    C++基础知识:泛型编程
  • 原文地址:https://www.cnblogs.com/chonglu/p/15786461.html
Copyright © 2020-2023  润新知