ASP.NET Core扩展库之日志功能的使用详解

 更新时间:2021年9月22日 09:59  点击:1556

    上一篇我们对Xfrogcn.AspNetCore.Extensions扩展库功能进行了简单的介绍,从这一篇文章开始,我将逐步介绍扩展库中的核心功能。
    日志作为非业务的通用领域基础功能,有非常多的技术实现,这些第三方库避免了我们花费时间去重复实现,不过,很多日志库配置复杂,不易于使用,入手较难,而有些库可能与ASP.NET Core的结合并不好。
    如果我们没有对所使用的日志库进行详细了解,日志库也可能产生严重的问题,在我的开发生涯中,曾经遇到过多次因为日志库而导致的生产事故。
    扩展库日志模块致力于将日志相关的最佳实践进行封装,简化日志库的使用,让我们真正从非业务代码中解放出来。

一、简介 

  ASP.NET Core扩展库中日志功能是对Serilog的进一步封装,之所以选择Serilog,源于我们在开发工程中的实践,我们的日志库经历了自己开发、选择使用NLog,最后定格在使用Serilog库上。
    Serilog日志库也并不是非常易于使用,而且可能也缺少一些必要功能,这就是我们需要进一步封装的原因。
    日志功能默认提供了Console及File两种日志目标,他们都分别支持文本和Json格式。
    我们也添加了日志的分类、日志记录层级的动态修改、本地文件日志的定时清理、本地日志文件的按目录存储、对容器化下EFK日志架构的支持、以及日志在测试中的支持功能等。

二、使用

    日志库是随着扩展库一起启用的,最简单的情况是启用扩展库即可,默认配置将开启文件日志目标,日志存入应用下Logs目录,以日期为文件夹,以日志名称为文件名称。
    开启扩展库有两种方式,可以在IHostBuilder上通过UseExtensions方法,或者在Startup启动类ConfigureServices方法中通过IServiceCollection的AddExtensions方法。

// 通过IHostBuilder上的UseExtensions方法
  // Program.cs .NET 5.0 
  public class Program
  {
    public static void Main(string[] args)
    {
      CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
      Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
          webBuilder.UseExtensions(args);
          webBuilder.UseStartup<Startup>();
        });
  }

或者:

// 在Startup类中
  public class Startup
  {

    public void ConfigureServices(IServiceCollection services)
    {
      services.AddExtensions(Configuration);
    }
  }

三、配置

    日志的配置可以通过代码方式或者通过配置文件方式。
    采用代码方式,在UseExtensions方法或者AddExtensions中传入配置对象委托即可:

public static IHostBuilder CreateHostBuilder(string[] args) =>
      Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
          webBuilder.UseExtensions(args, config=>
          {
            config.AppLogLevel = Serilog.Events.LogEventLevel.Verbose;
            config.SystemLogLevel = Serilog.Events.LogEventLevel.Verbose;
          });
          webBuilder.UseStartup<Startup>();
        });

如果采用配置文件方式,只需在配置源(如appsettings.json)中设置相关的配置字段:

{
 "AppLogLevel": "Verbose",
 "AllowedHosts": "*"
}

    如果都采用,代码方式将会覆盖配置文件方式。
    除此之外,如果你需要对Serilog配置进行更详细的控制,那么可以直接在UseExtensions方法或者AddExtensions中传入Serilog的日志配置委托。此项委托的设置将覆盖上述的自动配置。

四、配置日志级别

    为了简化配置,在扩展库中,我们根据日志名称将日志分为系统日志、应用日志以及EFCore日志,他们分别通过配置中的AppLogLevel、SystemLogLevel及EFCoreCommandLevel属性来控制。日志级别的配置都支持运行时动态修改,无需重启应用。

日志分类
对应日志名
对应配置字段
默认级别
系统日志
Microsoft.* 以及 System.*
SystemLogLevel
Warning
EFCore日志
Microsoft.EntityFrameworkCore.Database.Command
EFCoreCommandLevel
Information
应用日志
除开系统日志及EFCore日志之外的日志
AppLogLevel
Information

五、日志级别的动态修改

    如果你是通过配置源来配置的日志级别,那么当配置源更新时(一般通过配置对象的Reload方法),日志级别将自动修改。
    如果需要采用代码方式,你可以通过全局的WebApiConfig实例进行配置:

  // 动态修改日志级别
  var apiConfig = host.Services.GetRequiredService<WebApiConfig>();
  apiConfig.AppLogLevel = Serilog.Events.LogEventLevel.Error;

六、本地文件日志配置

    针对本地日志的配置,包含日志文件的路径模板、日志文件的定时清理、日志的自动压缩等。
    本地文件日志路径通过LogPathTemplate设置来配置,默认为LogPathTemplates.DayFolderAndLoggerNameFile,表示以每天作为子目录,以日志名称作为日志文件名。通过LogPathTemplates也内置了其他的路径模板:

路径模板名
说明
DayFolderAndLoggerNameFile
以每天日期为目录,日志名称为文件名
DayFile
以每天日期为日志名称
LoggerNameAndDayFile
以[日志名称_每天日志]为日志文件名称
LevelFile
以日志级别缩写为日志文件名称
DayFolderAndLevelFile
以每天日期为目录,日志级别缩写为日志名称

    由于LogPathTemplate为字符串配置,你也可以配置其他的路径模板。
    关于日志的定时清理,可以通过MaxLogDays配置来指定日志保留的天数,如果设置为0,表示不清理,这是默认配置。
    通过MaxLogFileSize以及RetainedFileCount配置可以设置日志文件的自动压缩策略,MaxLogFileSize默认设置为100mb,超过此大小后,日志将写到新的文件,RetainedFileCount为可旋转的日志文件数量,默认为31个,超过此数量后的日志将被自动压缩。

七、容器化支持

    在容器化环境下,日志一般会采用EFK的架构,在k8s中,我们推荐F采用fluent-bit而不是filebeat。这种框架下,我们只需将日志输出到控制台,容器将控制台输出定位到Docker宿主机,然后通过fluent-bit扫描日志文件,进行解析处理,发送给ES。
    在这种模式下,你需要将ConsoleJsonLog设置为true来开启JSON格式的控制台日志目标。同时,由于控制台单行字数有限制,可能导致日志被截取,故可能需要通过MaxLogLength来设置单条日志的长度限制,此设置默认为8kb,适合大多数场景。超出长度的日志并不会被忽略,而是会拆分成多条日志,以此来保证日志的完整性。

// 要支持容器化EFK日志模式,一般只需要设置ConsoleJsonLog为true即可
  public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
      .ConfigureWebHostDefaults(webBuilder =>
      {
        webBuilder.UseExtensions(args, config=>
        {
          config.ConsoleJsonLog = true;
        });
        webBuilder.UseStartup<Startup>();
      });

八、测试支持

    有时我们可能需要在单元测试中检查日志的输出,这时,我们可以使用扩展库在ILoggingBuilder上的扩展方法来添加测试日志目标。随后,你可以通过IServiceProvider上的GetTestLogContent方法获取已记录的日志内容列表。

IServiceCollection services = new ServiceCollection()
    .AddExtensions()
    .AddLogging(logBuilder =>
    {
      // 添加测试日志记录器
      logBuilder.AddTestLogger();
    });
    
  IServiceProvider provider = services.BuildServiceProvider();
  // 获取日志内容
  var logContent = provider.GetTestLogContent();

九、禁用Serilog

    如果你觉得上述所有功能都不太适合你的场景,但是你又需要使用扩展库的其他功能,那怎么办呢? 非常简单,你只需要将EnableSerilog设置为false,即可完全禁用上述日志功能。 

有关日志的详细配置,可参考[文档]
Xfrogcn.AspNetCore.Extensions地址:[GitHub] [Gitee]

以上就是ASP.NET Core扩展库之日志功能的使用详解的详细内容,更多关于ASP.NET Core扩展库之日志功能的资料请关注猪先飞其它相关文章!

[!--infotagslink--]

相关文章

  • ASP.NET购物车实现过程详解

    这篇文章主要为大家详细介绍了ASP.NET购物车的实现过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
  • .NET Core下使用Kafka的方法步骤

    这篇文章主要介绍了.NET Core下使用Kafka的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • 在ASP.NET 2.0中操作数据之七十二:调试存储过程

    在开发过程中,使用Visual Studio的断点调试功能可以很方便帮我们调试发现程序存在的错误,同样Visual Studio也支持对SQL Server里面的存储过程进行调试,下面就让我们看看具体的调试方法。...2021-09-22
  • 详解.NET Core 3.0 里新的JSON API

    这篇文章主要介绍了详解.NET Core 3.0 里新的JSON API,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • ASP.NET Core根据环境变量支持多个 appsettings.json配置文件

    这篇文章主要介绍了ASP.NET Core根据环境变量支持多个 appsettings.json配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • 记一次EFCore类型转换错误及解决方案

    这篇文章主要介绍了记一次EFCore类型转换错误及解决方案,帮助大家更好的理解和学习使用asp.net core,感兴趣的朋友可以了解下...2021-09-22
  • 详解ASP.NET Core 中基于工厂的中间件激活的实现方法

    这篇文章主要介绍了ASP.NET Core 中基于工厂的中间件激活的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-22
  • asp.net通过消息队列处理高并发请求(以抢小米手机为例)

    这篇文章主要介绍了asp.net通过消息队列处理高并发请求(以抢小米手机为例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • Underscore源码分析

    Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象。这篇文章主要介绍了underscore源码分析相关知识,感兴趣的朋友一起学习吧...2016-01-02
  • ASP.NET 2.0中的数据操作:使用两个DropDownList过滤的主/从报表

    在前面的指南中我们研究了如何显示一个简单的主/从报表, 该报表使用DropDownList和GridView控件, DropDownList填充类别,GridView显示选定类别的产品. 这类报表用于显示具有...2016-05-19
  • ASP.NET单选按钮控件RadioButton常用属性和方法介绍

    RadioButton又称单选按钮,其在工具箱中的图标为 ,单选按钮通常成组出现,用于提供两个或多个互斥选项,即在一组单选钮中只能选择一个...2021-09-22
  • 详解.NET Core 使用HttpClient SSL请求出错的解决办法

    这篇文章主要介绍了.NET Core 使用HttpClient SSL请求出错的解决办法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2021-09-22
  • ASP.NET中iframe框架点击左边页面链接 右边显示链接页面内容

    这篇文章主要介绍了ASP.NET中iframe框架点击左边页面链接,右边显示链接页面内容的实现代码,感兴趣的小伙伴们可以参考一下...2021-09-22
  • 创建一个完整的ASP.NET Web API项目

    ASP.NET Web API具有与ASP.NET MVC类似的编程方式,ASP.NET Web API不仅仅具有一个完全独立的消息处理管道,而且这个管道比为ASP.NET MVC设计的管道更为复杂,功能也更为强大。下面创建一个简单的Web API项目,需要的朋友可以参考下...2021-09-22
  • ASP.NET连接MySql数据库的2个方法及示例

    这篇文章主要介绍了ASP.NET连接MySql数据库的2个方法及示例,使用的是MySQL官方组件和ODBC.NET,需要的朋友可以参考下...2021-09-22
  • Asp.Net使用Bulk实现批量插入数据

    这篇文章主要介绍了Asp.Net使用Bulk实现批量插入数据的方法,对于进行asp.net数据库程序设计非常有借鉴价值,需要的朋友可以参考下...2021-09-22
  • 在ASP.NET 2.0中操作数据之二十九:用DataList和Repeater来显示数据

    本文主要讲解ASP.NET 2.0中如何使用DataList 和 Repeater 来呈现数据,DataList包含一个table标记,而Repeater不会添加任何额外的代码,个人在实际开发中更推荐使用Repeater。...2021-09-22
  • Asp.net中获取DataTable选择第一行某一列值

    这篇文章主要介绍了获取DataTable选择第一行某一列值,需要的朋友可以参考下...2021-09-22
  • Asp.net动态生成html页面的方法分享

    这篇文章介绍了Asp.net动态生成html页面的方法,有需要的朋友可以参考一下...2021-09-22
  • ASP.Net中的async+await异步编程的实现

    这篇文章主要介绍了ASP.Net中的async+await异步编程的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22