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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 16:45:15