上一篇我们对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扩展库之日志的更多相关文章

  1. Log4net 的 ASP.NET Core 扩展库

    给大家安利一款 log4net 的 ASP.NET Core 扩展库,它是基于 log4net 开发的. 简单易用,开源免费,使用ASP.NET Core自身提供的DI容器来实现服务的注册和消费.直接 ...

  2. ASP.NET Core扩展库

    亲爱的.Neter们,在我们日复一日的编码过程中是不是会遇到一些让人烦恼的事情: 日志配置太过复杂,各种模板.参数也搞不清楚,每次都要去查看日志库的文档,还需要复制粘贴一些重复代码,好无赖 当需要类型 ...

  3. ServiceStack.Redis 的 ASP.NET Core 扩展库

    给大家安利一款 ServiceStack.Redis 的 ASP.NET Core 扩展库,它是基于 ServiceStack.Redis.Core 开发的. 简单易用,开源免费,使用ASP.NET ...

  4. ASP.NET Core扩展库之Http通用扩展

    本文将介绍Xfrogcn.AspNetCore.Extensions扩展库对于Http相关的其他功能扩展,这些功能旨在处理一些常见需求, 包括请求缓冲.请求头传递.请求头日志范围.针对HttpClie ...

  5. ASP.NET Core扩展库之Http请求模拟

    如今,完全独立的业务应用几乎不存在,不管是在企业内部微服务之间的调用,还是与外部第三方服务的调用,Http的API交互是常见的场景,这些实际情况给我们的开发带来了比较大的挑战,一是第三方服务可能会牵制 ...

  6. ASP.NET Core扩展库之实体映射

    在分层设计模式中,各层之间的数据通常通过数据传输对象(DTO)来进行数据的传递,而大多数情况下,各层数据的定义结构大同小异,如何在这些定义结构中相互转换,之前我们通过使用AutoMapper库,但Au ...

  7. Asp.net core 使用log4net作为日志组件,记录日志到本地。

    原文:Asp.net core 使用log4net作为日志组件,记录日志到本地. GitHub demo :https://github.com/zhanglilong23/Asp.NetCore.D ...

  8. ASP.NET MVC扩展库

    很多同学都读过这篇文章吧 ASP.NET MVC中你必须知道的13个扩展点,今天给大家介绍一个ASP.NET MVC的扩展库,主要就是针对这些扩展点进行.这个项目的核心是IOC容器,包括Ninject ...

  9. Asp.net Core + Log4net + ELK 搭建日志中心

    原文:Asp.net Core + Log4net + ELK 搭建日志中心 Docker中一键安装ELK 对于这种工具类的东西,第一步就直接到docker的hub中查找了,很幸运,不仅有Elasti ...

随机推荐

  1. Codeforces Round #515 (Div. 3) B. Heaters (贪心)

    题意:有\(n\)个桩子,\(1\)表示该位置有一个火炉,可以使两边距离为\(r\)的范围照亮,问最少使用多少炉子使得所有范围都被照亮. 题解:贪心,首先我们从\(r\)位置开始向左找,如果找到了就记 ...

  2. Win10 资源管理器经常卡死问题

    什么问题? 我的Win10资源管理器开始出现卡死(假死.未响应)的情况,频率越来越高,触发方式越来越广,包括OpenDialog.打开拥有快捷方式的文件夹/桌面.右键空白处.右键文件/文件夹.拖动文件 ...

  3. Java15变量竟然没什么区别,八大基本数据类型你知道吗?

    变量是什么? 变量是用来为不同数据类型在内存中分配的空间用来储存该数据. 不同于python这样的弱类型语言,变量声明不需要定义数据类型,就和写数学方程式一般,谁等于谁即可.而Java这个发展了多个版 ...

  4. 9.[完]其他常用的rabbitmq的参数和设置

    作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-08-12 20:42:25 星期一 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...

  5. 字节笔试题 leetcode 69. x 的平方根

    更多精彩文章请关注公众号:TanLiuYi00 题目 解题思路 题目要求非负整数 x 的平方根,相当于求函数 y = √x 中 y 的值. 函数 y = √x  图像如下: 从上图中,可以看出函数是单 ...

  6. mysql(四)------Mysql中的锁

    1. 2 MySQL InnoDB 锁的基本类型 https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html 官网把锁分成了 8 类.所以我 ...

  7. Vue Component Registration All In One

    Vue Component Registration All In One Vue 注册自定义组件 <template> <div class="back-to-top-c ...

  8. 如何使用 js 实现一个 debounce 函数

    如何使用 js 实现一个 debounce 函数 原理 防抖: 是指在指定的单位时间内,如果重复触发了相同的事件,则取消上一次的事件,重新开始计时! 实现方式 "use strict&quo ...

  9. setTimeout 实现原理, 机制

    setTimeout 实现原理, 机制 JS 执行机制说起 浏览器(或者说 JS 引擎)执行 JS 的机制是基于事件循环. 由于 JS 是单线程,所以同一时间只能执行一个任务,其他任务就得排队,后续任 ...

  10. 2021 NGK生态所体验好、交易快 引人注目!

    据悉,NGK计划于2021年2月15日正式上线自己的生态所(时间待定),目的在于满足NGK生态建设者对于NGK几大币种的交易等需求,如NGK.BGV.SPC.USDN.VAST等.只要上NGK生态所, ...