.NET 5应用使用Serilog DataDog Sink时不记录Information级日志
问题分析与解决方案
核心原因
你碰到的问题大概率是Serilog异步日志发送机制导致的:Serilog.Sinks.Datadog.Logs 默认采用异步批量投递日志的方式,当你在using块写完日志后,Logger立刻被Dispose,此时Information级别的日志可能还在本地队列里,没来得及发送到Datadog就被终止了。其他级别日志能正常显示,可能是因为批量触发条件(比如日志数量、时间间隔)刚好在Dispose前满足,或是不同级别日志的处理逻辑存在细微差异。
解决方案
方案1:显式触发日志刷新
在using块结束前,调用Log.CloseAndFlush()强制把队列里所有待发日志投递出去:
using (var log = new LoggerConfiguration() .MinimumLevel.Verbose() .WriteTo.DatadogLogs("HERE IS MY API KEY", service: "myservice", configuration: new DatadogConfiguration() { Url = "https://http-intake.logs.us3.datadoghq.com" }) .CreateLogger()) { log.Debug("debug"); log.Information("information"); log.Verbose("verbose"); log.Warning("warning"); log.Error("error"); log.Fatal("fatal"); // 强制刷新所有待发送日志 Log.CloseAndFlush(); }
方案2:配置同步投递(仅用于测试)
如果只是做测试,可以修改Sink配置强制同步发送日志(生产环境不建议这么做,会影响应用性能):
.WriteTo.DatadogLogs( "HERE IS MY API KEY", service: "myservice", configuration: new DatadogConfiguration() { Url = "https://http-intake.logs.us3.datadoghq.com" }, // 配置同步发送 batchPostingLimit: 1, period: TimeSpan.Zero )
方案3:整合Serilog到.NET Host(生产环境推荐)
实际生产环境中,应该把Serilog整合到.NET Host的日志系统里,而不是单独创建Logger实例。这样Host会自动管理Logger的生命周期,确保应用关闭前所有日志都能正确投递:
static async Task Main(string[] args) { Log.Logger = new LoggerConfiguration() .MinimumLevel.Verbose() .WriteTo.DatadogLogs("HERE IS MY API KEY", service: "myservice", configuration: new DatadogConfiguration() { Url = "https://http-intake.logs.us3.datadoghq.com" }) .CreateLogger(); try { using IHost host = CreateHostBuilder(args).Build(); // 从Host服务中获取Logger,或直接使用Log.Logger var logger = host.Services.GetRequiredService<ILogger<Program>>(); logger.LogDebug("debug"); logger.LogInformation("information"); logger.LogVerbose("verbose"); logger.LogWarning("warning"); logger.LogError("error"); logger.LogCritical("fatal"); await host.RunAsync(); } finally { Log.CloseAndFlush(); } } // 修改CreateHostBuilder,添加Serilog整合 static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseSerilog() // 将Serilog整合到Host日志系统 .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
额外检查项
- 确认Datadog平台的日志过滤规则没有排除
info级别的日志:检查Datadog的日志索引配置,确保没有过滤Information级别的条目。 - 升级Serilog.Sinks.Datadog.Logs版本:v0.5.2是较旧的版本,新版本可能修复了异步投递的相关问题,建议升级到最新稳定版。
内容的提问来源于stack exchange,提问作者Denis Kaminsky
相关产品推荐
相关产品推荐

