.NET Framework下双进程运行仅单个进程的Serilog日志可发送至Loggly
可能的原因
- SelfLog 开启时机过晚:两个项目都是先初始化Logger、打印日志后才开启SelfLog,若Loggly sink初始化或发送阶段出现错误,无法捕获到异常信息,无法定位具体问题。
- 批量发送参数不匹配短生命周期进程:Serilog.Sinks.Loggly 基于 PeriodicBatching 实现,默认会攒够一定数量日志/等待固定间隔才会批量发送。Job2 为单次执行的短进程,日志量少,默认配置下可能在日志还未完成发送时,进程就已退出,默认的 CloseAndFlush 超时时间不足以支撑剩余日志发送完成。
- 部署环境配置缺失:部署后 Job2 的运行目录下 App.config 未正确更新,或缺失 Serilog.Sinks.Loggly 依赖文件,导致sink未生效。
- 未捕获的进程崩溃异常:若Job2执行过程中触发非托管异常、堆栈溢出等会直接终止进程的异常,finally块的CloseAndFlush不会执行,内存中未发送的日志直接丢失。
解决方法
- 调整SelfLog开启位置,优先捕获初始化错误
两个项目都将SelfLog开启代码移到Logger初始化之前,确保能捕获到所有Serilog运行时错误:
// 放在Main方法最开头 Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg)); Log.Logger = new LoggerConfiguration().ReadFrom.AppSettings().CreateLogger();
运行时查看控制台输出的Serilog报错信息,可直接定位配置、网络、权限类问题。
- 显式配置Loggly批量参数与Flush超时
针对短生命周期的Job2,调整Loggly的批量发送阈值和间隔,同时给CloseAndFlush设置更长的等待时间:
- 在Job2的App.config中添加以下配置,降低批量发送门槛:
<add key="serilog:write-to:Loggly.batchPostingLimit" value="1" /> <add key="serilog:write-to:Loggly.period" value="00:00:01" />
- 将finally块的CloseAndFlush修改为指定超时时间,确保日志有足够时间发送:
Log.CloseAndFlush(TimeSpan.FromSeconds(15));
- 验证部署环境配置与依赖
- 检查Job2运行目录下的
.config文件,确认Loggly相关配置与本地调试配置一致,CustomerToken无拼写错误 - 检查运行目录下是否存在
Serilog.Sinks.Loggly.dll、Serilog.Sinks.PeriodicBatching.dll依赖文件,避免部署时遗漏依赖
- 增加进程异常捕获
在Main方法最外层增加未捕获异常处理,确保极端场景下也能触发日志Flush:
AppDomain.CurrentDomain.UnhandledException += (s, e) => { Log.Fatal((Exception)e.ExceptionObject, "进程未捕获异常"); Log.CloseAndFlush(TimeSpan.FromSeconds(10)); };
内容的提问来源于stack exchange,提问作者KVN
相关产品推荐
相关产品推荐

