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

.NET Framework环境下Serilog仅Main()方法日志上报到Loggly问题求助

Serilog仅上报Main方法日志到Loggly问题排查

问题根因

  • 最常见原因:Serilog.Sinks.Loggly默认采用异步批量发送机制,日志会先写入本地内存队列,攒到指定数量/间隔后才批量上报到Loggly服务。当前代码在Execute/Print执行完成后,进程直接退出,队列中还没来得及上报的日志会随着进程销毁直接丢失,只有最早触发上报的第一条日志能成功发送。
  • 次要原因:配置了ThrowExceptions = false,即使日志上报过程出现异常也不会抛出,无法感知上报链路的错误;另外未配置日志落盘校验,无法区分是日志未生成还是上报失败。
  • 其他可能:业务代码中存在未捕获异常,导致Execute/Print还没执行完成、或者日志还没上报进程就异常终止。

修复方案

1. 新增日志强制刷出逻辑

在Main方法末尾添加finally块,调用Log.CloseAndFlush(),确保所有队列中的日志全部上报完成后再退出进程,这是短生命周期应用使用Serilog的标准操作。

2. 调整Loggly上报参数(短生命周期程序适配)

调小批量上报的阈值和间隔,避免日志在队列中等待时间过长,赶上进程退出的时间窗口。

3. 新增本地日志校验(调试用)

新增文件/控制台Sink,先确认后续方法的日志确实被Serilog生成,排除日志过滤、方法未执行的问题。

修改后参考代码

public static void Main(string[] args)
{
    try
    {
        Log.Logger = new LoggerConfiguration()
            .ReadFrom.AppSettings()
            .Enrich.FromLogContext()
            // 调试阶段新增本地文件输出,确认日志生成情况
            .WriteTo.File("serilog_local.log", rollingInterval: RollingInterval.Day)
            .WriteTo.Loggly(
                logglyConfig: new LogglyConfiguration
                {
                    ApplicationName = ConfigurationManager.AppSettings["Loggly.ApplicationName"],
                    CustomerToken = ConfigurationManager.AppSettings["Loggly.CustomerToken"],
                    Tags = ConfigurationManager.AppSettings["Loggly.Tags"].Split(',').ToList(),
                    EndpointHostName = "xxx.loggly.com",
                    EndpointPort = 443,
                    IsEnabled = true,
                    LogTransport = TransportProtocol.Https,
                    // 调试阶段开启异常抛出,方便定位上报错误
                    ThrowExceptions = true,
                    OmitTimestamp = false
                },
                // 短生命周期程序调小批量参数,加快上报速度
                batchPostingLimit: 1,
                period: TimeSpan.FromMilliseconds(100)
            ).CreateLogger();
        Log.Information($"[{nameof(Program)}] Starting...");
        
        Execute();
    }
    catch (Exception ex)
    {
        Log.Fatal(ex, "程序运行出现未捕获异常");
    }
    finally
    {
        // 核心:强制刷出所有队列中的日志,完成上报后再退出
        Log.CloseAndFlush();
    }
}

public static void Execute()
{
    Log.Information($"Executing [{nameof(Program)}] ...");
    // ... some processing code here ...
    Print();
}

public static void Print()
{
    Log.Information($"Printing Data");
    // ... some printing code here ...
}

额外排查点

  • 先验证Execute、Print方法确实被正常调用,可通过断点、Console.WriteLine输出确认
  • 若业务代码中存在Environment.Exit()等主动终止进程的逻辑,需要在调用前手动执行Log.CloseAndFlush()
  • 若排查后本地文件有后续日志但Loggly仍未收到,可临时关闭HTTPS传输改用HTTP测试,确认是否是SSL证书校验导致的上报失败

内容的提问来源于stack exchange,提问作者KVN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:36:06