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

.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不会执行,内存中未发送的日志直接丢失。
解决方法
  1. 调整SelfLog开启位置,优先捕获初始化错误
    两个项目都将SelfLog开启代码移到Logger初始化之前,确保能捕获到所有Serilog运行时错误:
// 放在Main方法最开头
Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));
Log.Logger = new LoggerConfiguration().ReadFrom.AppSettings().CreateLogger();

运行时查看控制台输出的Serilog报错信息,可直接定位配置、网络、权限类问题。

  1. 显式配置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));
  1. 验证部署环境配置与依赖
  • 检查Job2运行目录下的.config文件,确认Loggly相关配置与本地调试配置一致,CustomerToken无拼写错误
  • 检查运行目录下是否存在Serilog.Sinks.Loggly.dll、Serilog.Sinks.PeriodicBatching.dll依赖文件,避免部署时遗漏依赖
  1. 增加进程异常捕获
    在Main方法最外层增加未捕获异常处理,确保极端场景下也能触发日志Flush:
AppDomain.CurrentDomain.UnhandledException += (s, e) =>
{
    Log.Fatal((Exception)e.ExceptionObject, "进程未捕获异常");
    Log.CloseAndFlush(TimeSpan.FromSeconds(10));
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:15:05