You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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能接收这些日志即可:

  1. 确认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();
    
  2. 启用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:

  1. 实现自定义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);
        }
    }
    
  2. 注册监听器到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 08:52:48