.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
相关产品推荐
相关产品推荐

