使用appsettings.json配置和依赖注入调用Serilog日志模块
appsettings.json配置Serilog
{
//"Logging": {
// "LogLevel": {
// "Default": "Information",
// "Microsoft.AspNetCore": "Warning"
// }
//},
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Information",
"Microsoft.AspNetCore": "Warning",
"System": "Warning"
}
},
"WriteTo": [
//{ "Name": "Console" },
//{
// "Name": "File",
// "Args": {
// "path": "./Logs/log-.txt",
// "rollingInterval": "Day",
// "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"
// }
//},
{
"Name": "MSSqlServer",
"Args": {
"connectionString": "Server=DESKTOP-DABHN6U\\MSSQLSERVER2014;uid=sa;pwd=Lz38275292;database=NewAps;MultipleActiveResultSets=true;",
"tableName": "Log",
"autoCreateSqlTable": true //自动创建日志表Log
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
"Properties": {
"Application": "WepAPI"
}
},
"AllowedHosts": "*",
}
使用 Serilog 日志服务,在 Program.cs 文件中添加以下代码
//为了使用appsettings.json配置和依赖注入,分两步初始化Serilog日志
//1.Serilog 日志,1.配置初始“引导”记录器
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console()
.CreateBootstrapLogger();
//2.Serilog 日志 创建最终记录器
builder.Host.UseSerilog((context, services, configuration) =>
configuration.ReadFrom.Configuration(context.Configuration)
.ReadFrom.Services(services)
.Enrich.FromLogContext()
.WriteTo.Console());
Web项目引用以下程序包
Install-Package Serilog.AspNetCore Install-Package Serilog.Sinks.MSSqlServer Install-Package Serilog.Settings.Configuration
注意:当没有引用 Serilog.Sinks.MSSqlServer 包时,日志不会写入数据库
消费 Serilog 日志
//日志测试控制器
[Route("api/[controller]")]
[ApiController]
public class LoggerTestController : ControllerBase
{
private readonly ILogger<LoggerTestController> _logger;
public LoggerTestController(ILogger<LoggerTestController> logger)
{
_logger = logger;
}
[HttpGet]
public async Task WriterLogger()
{
int eventId = 3721;
_logger.LogInformation(eventId, "升级到最新版本({version})", "1.0.0.rc2");
_logger.LogWarning(eventId, "并发量接近上限({maximum}) ", 200);
_logger.LogError(eventId, "数据库连接失败(数据库:{Database},用户名:{User})", "TestDb", "sa");
}
}
在日志中添加增强属性
public static class RequestEnricher
{
public static void LogAdditionalInfo(IDiagnosticContext diagnosticContext,HttpContext httpContext)
{
diagnosticContext.Set("ClientIP",httpContext.Connection.RemoteIpAddress?.ToString());
diagnosticContext.Set("UserName", httpContext.User?.Identity?.Name == null ? "(anonymous)" : httpContext.User.Identity.Name);
}
}
使用日志增强中间件
var app = builder.Build(); //Serilog 日志增强 app.UseSerilogRequestLogging(options => options.EnrichDiagnosticContext = RequestEnricher.LogAdditionalInfo);
注意:app.UseSerilogRequestLogging() 中间件的顺序
提示:常用第三方日志提供程序:NLog、Serilog、Log4Net
手动创建日志表Sql(可选):
/****** Object: Table [dbo].[Log] Script Date: 2022-09-26 18:24:33 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Log]( [Id] [int] IDENTITY(1,1) NOT NULL, [Message] [nvarchar](max) NULL, [MessageTemplate] [nvarchar](max) NULL, [Level] [nvarchar](max) NULL, [TimeStamp] [datetime] NULL, [Exception] [nvarchar](max) NULL, [Properties] [nvarchar](max) NULL, CONSTRAINT [PK_Log] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO
进一步学习:https://andrewlock.net/using-serilog-aspnetcore-in-asp-net-core-3-reducing-log-verbosity/
浙公网安备 33010602011771号