在我们项目开发的过程中,使用.NET 6自带的日志系统有时是不能满足实际需求的,比如有的时候我们需要将日志输出到第三方平台上,最典型的应用就是在各种云平台上,为了集中管理日志和查询日志,通常会选择对应平台的日志SDK进行集成。比如微软Azure提供的Azure App Service Logging,基础的用法可以参考这篇文章:ASP.NET Core Logging with Azure App Service and Serilog。同时在这篇文章中也提到了使用Serilog提供的多种Sink,可以实现将日志写入不同云平台或者是非云平台的日志存储中去,这是我们这篇文章讲要研究的内容。
查阅Serilog的官方文档和一些示例后确定,我们要做的事情有这么几件:
Serilog.AspNetCore
包(很多文章或者教程里都让你根据需要使用的Sink去继续引入类似Serilog.Sink.File
之类的包,但是实际上Serilog.AspNetCore
包的依赖项里已经包含了File
这个Sink,所以实际上没有必要再去添加一次);Serilog
的Logger
对象提供一个LoggerConfiguration
,可以以代码的方式进行配置,也可以通过加载.json
文件的方式进行配置,看自己的需求和对配置热更新的有没有独特的要求决定;WebApplicationBuilder
对象的时候声明UseSerilog()
;ILogger<T>
对象即可,我们一般是在构造函数里进行注入,当然也可以选择其他两种注入方式。引入Serilog包
Install-Package Serilog.AspNetCore
创建日志配置文件,以便于在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(); } }
Program中注入服务
Tips:.NET6之前没有顶级代码这个特性,应在StartUp中注入
using TodoList.Infrastructure.Log; var builder = WebApplication.CreateBuilder(args); // Add services to the container. //配置日志 builder.ConfigureLog(); builder.Services.AddControllers(); .....
配置日志文件输出路径及日志输出方式
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "UseFileToLog": true, "LogFilePath": "./bin/logs" }
在日志策略方法中我们是在appsettings.Development.json
这个配置文件中取值的,所以这里需要配置一下,这里只是打个比方。
最后在代码中尽情使用吧
验证一下
控制台输出:
文件输出:
https://github.com/luchong0813/TodoList