引言
在我们项目开发的过程中,使用.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": "@R_894_4045@ion", "Microsoft.AspNetCore": "Warning" } }, "UseFiletoLog": true, "LogFilePath": "./bin/logs" }
在日志策略方法中我们是在
appsettings.Development.json
这个配置文件中取值的,所以这里需要配置一下,这里只是打个比方。 -
最后在代码中尽情使用吧
-
验证一下
控制台输出:
代码
https://github.com/luchong0813/TodoList
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。