使用UseSerilogRequestLogging时如何添加自定义日志提供程序?
解决方案
要让自定义日志提供程序在Serilog管道中生效,核心是理解Serilog接管Microsoft.Extensions.Logging系统后,原有的MS日志提供程序不会自动参与Serilog的日志流,可通过以下两种方式适配:
方式一:将自定义逻辑封装为Serilog Sink(推荐)
Serilog的扩展机制基于Sink实现,直接把原自定义日志提供程序的逻辑改成Serilog的ILogEventSink,就能直接融入Serilog管道:
- 创建自定义Sink类:
using Serilog; using Serilog.Core; using Serilog.Events; public class CustomSerilogSink : ILogEventSink { public void Emit(LogEvent logEvent) { // 这里实现原CustomLoggerProvider中的日志处理逻辑 // 例如格式化日志内容、输出到自定义存储等 string formattedLog = $"{logEvent.Timestamp:yyyy-MM-dd HH:mm:ss} [{logEvent.Level}] {logEvent.MessageTemplate.Render(logEvent.Properties)}"; // 执行你的自定义操作,比如写入文件、发送到消息队列等 } }
- 配置Serilog时添加该Sink,并注入到服务中:
// 构建Serilog Logger var logger = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.Custom(new CustomSerilogSink()) // 添加自定义Sink // 可同时保留其他Sink,比如控制台 .WriteTo.Console() .CreateLogger(); // 注入Serilog到服务,替代默认日志系统 builder.Services.AddSerilog(logger); // 正常启用请求日志 app.UseSerilogRequestLogging();
方式二:将Serilog日志转发到原有MS日志提供程序
如果不想修改原自定义LoggerProvider的代码,可以让Serilog把日志转发回Microsoft.Extensions.Logging系统,这样原自定义提供程序就能收到日志:
using Serilog.Extensions.Logging; // 构建Serilog Logger,配置转发到MS日志系统 var logger = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.ExtensionsLogging(configure => { // 在MS日志配置中添加你的自定义提供程序 configure.AddCustomLoggerProvider(); }) .CreateLogger(); // 注入Serilog builder.Services.AddSerilog(logger); // 启用请求日志 app.UseSerilogRequestLogging();
为什么之前的方法不生效?
当调用services.AddSerilog()时,Serilog会替换Microsoft.Extensions.Logging的默认日志提供程序,所有日志请求都会直接进入Serilog管道,原通过builder.Logging.AddCustomLoggerProvider()添加的MS日志提供程序不会被触发。而你尝试的LoggerProviderCollection需要配合WriteTo.LoggerProviderCollection()一起使用,否则Serilog不会将日志转发到该集合中的提供程序,这也是之前配置无效的原因。
内容的提问来源于stack exchange,提问作者Tyler Durden
相关产品推荐
相关产品推荐

