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

Serilog对接Application Insights:请求日志正常但跟踪日志及意外终止日志丢失

问题1:Serilog日志无法写入Application Insights

咱们先从最容易排查的点开始:你在appsettings.json的Application Insights sink配置里,connectionString前面多了个多余的*符号,这会直接导致连接字符串无效,先把它去掉:

"Args": {
  "connectionString": "MyConnectionString", // 移除开头的*
  "telemetryConverter": "Serilog.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter, Serilog.Sinks.ApplicationInsights"
}

接下来,你当前使用的TraceTelemetryConverter会把所有日志统一转换成Application Insights的Trace类型,异常日志不会被单独识别为Exception Telemetry(也就不会出现在AI的「Exceptions」面板里)。如果希望异常日志被正确分类,建议换成TraceAndExceptionTelemetryConverter:

"telemetryConverter": "Serilog.Sinks.ApplicationInsights.TelemetryConverters.TraceAndExceptionTelemetryConverter, Serilog.Sinks.ApplicationInsights"

另外,检查一下你的Program.cs配置顺序:builder.Services.AddApplicationInsightsTelemetry()和builder.Host.UseSerilog()的顺序是对的,但可以确认下Bootstrap Logger的配置是否正确——你用CreateBootstrapLogger()初始化的启动日志,后续会被UseSerilog()接管,这部分没问题,但如果启动阶段的日志没进AI,可能需要把Bootstrap Logger的配置也加上Application Insights sink(不过你的核心问题是业务日志没进去,先解决前面的问题再说)。

最后,清理一下项目的bin/obj文件夹重新编译,避免缓存的旧配置干扰,然后再测试日志是否能正常写入AI。


问题2:应用意外终止时日志丢失

控制台用ctrl + c关闭时,finally块里的Log.CloseAndFlush()会执行,日志能正常刷入AI,但如果是进程被强制杀死、服务器意外重启这类意外终止场景,这个方法根本没机会执行,内存里积压的日志就会丢失。可以通过两种方式优化:

方式1:配置日志自动刷新间隔

在Application Insights sink的配置里添加period参数,设置固定的日志刷新频率,比如每5秒自动发送一次,这样即使意外终止,最多只会丢失最近5秒的日志:

"Args": {
  "connectionString": "MyConnectionString",
  "telemetryConverter": "Serilog.Sinks.ApplicationInsights.TelemetryConverters.TraceAndExceptionTelemetryConverter, Serilog.Sinks.ApplicationInsights",
  "period": "00:00:05" // 每5秒刷新一次日志队列
}

方式2:启用异步日志处理

安装Serilog.Sinks.Async包后,用异步sink包装Application Insights sink,异步处理不仅能提升性能,还能更灵活地控制日志发送策略。修改appsettings.json的WriteTo配置如下:

"WriteTo": [
  {
    "Name": "Async",
    "Args": {
      "configure": [
        {
          "Name": "ApplicationInsights",
          "Args": {
            "connectionString": "MyConnectionString",
            "telemetryConverter": "Serilog.Sinks.ApplicationInsights.TelemetryConverters.TraceAndExceptionTelemetryConverter, Serilog.Sinks.ApplicationInsights",
            "period": "00:00:05"
          }
        }
      ]
    }
  },
  {
    "Name": "Console"
  }
]

异步sink会在后台线程处理日志发送,还能配置队列大小、溢出策略等,进一步降低日志丢失的风险。

另外补充一句:关闭浏览器窗口不会导致后端Web应用进程终止(除非你用的是IIS Express这类开发服务器,关闭浏览器可能会触发进程停止),生产环境里的Web应用进程终止通常是服务器重启、应用池回收等场景,上面的配置就能覆盖这些情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 17:30:42