求助:Serilog无法输出Trace.WriteLine内容(.NET Core 2.2环境)
解决思路:让Serilog捕获
Trace.WriteLine的输出 我之前在.NET Core项目里也碰到过一模一样的问题,核心原因其实很明确——Serilog默认不会自动订阅System.Diagnostics.Trace的输出流。Trace.WriteLine属于.NET传统的诊断跟踪体系,和Serilog的日志管道是相互独立的,得手动做集成配置才行。结合你的.NET Core 2.2和Serilog.AspNetCore 3.2.0环境,给你两个可行的解决方案:
方案一:通过Microsoft.Extensions.Logging桥接Trace输出到Serilog
.NET Core中Trace.WriteLine的输出会被TraceSourceLoggerProvider捕获,我们只需要确保这个Provider的日志级别足够低,同时让Serilog能接收这些日志即可:
确认Serilog的全局级别配置
确保你在初始化Serilog时,不仅全局最低级别设为Verbose,还要避免过滤掉System.Diagnostics相关的日志源:Log.Logger = new LoggerConfiguration() .MinimumLevel.Verbose() .MinimumLevel.Override("Microsoft", LogEventLevel.Information) // 关键:不要过滤System.Diagnostics的日志,让Trace输出能进入Serilog管道 .MinimumLevel.Override("System.Diagnostics.TraceSource", LogEventLevel.Verbose) .WriteTo.Console() // 替换成你实际使用的输出目标(比如文件、ELK等) .CreateLogger();启用TraceSourceProvider并配置级别
在Program.cs的CreateWebHostBuilder方法中,添加Trace源的日志配置:public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseSerilog() .ConfigureLogging(logging => { // 启用TraceSource日志提供者,指定最低级别为Verbose logging.AddTraceSource(new SourceSwitch("GlobalTraceSwitch", "Verbose"), new ConsoleTraceListener(false)); // 全局日志级别设为Trace,确保Trace输出不会被拦截 logging.SetMinimumLevel(LogLevel.Trace); }) .UseStartup<Startup>();
方案二:自定义TraceListener直接转发到Serilog
如果方案一不生效,你可以写一个自定义的TraceListener,把所有Trace.WriteLine的输出直接写入Serilog:
实现自定义TraceListener
public class SerilogTraceListener : TraceListener { private readonly ILogger _logger; public SerilogTraceListener(ILogger logger = null) { _logger = logger ?? Log.Logger; } public override void Write(string message) { _logger.Verbose(message); } public override void WriteLine(string message) { _logger.Verbose(message); } }注册监听器到Trace体系
在Startup.cs的Configure方法里,把这个自定义监听器添加到Trace的Listeners集合:public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // ...其他中间件配置 // 添加Serilog监听器,接管Trace输出 Trace.Listeners.Add(new SerilogTraceListener()); // 开启自动刷新,确保日志实时输出 Trace.AutoFlush = true; }
额外检查项
- 排查
appsettings.json中的日志过滤规则:确保没有把System.Diagnostics相关的日志级别设得过高,比如:"Logging": { "LogLevel": { "Default": "Trace", "System.Diagnostics.TraceSource": "Trace" } } - 确认Serilog输出目标的级别限制:有些输出目标会单独设置最低级别,比如
WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Verbose),要确保这里的级别不高于Verbose。
内容的提问来源于stack exchange,提问作者Tomas Blanárik
相关产品推荐
相关产品推荐

