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

如何在.NET Core中使用Serilog将异常记录到Application Insights?

问题排查与修复方案

1. 核心错误:日志方法参数传值错误

你当前的异常日志写法不符合Serilog的方法重载规则:

// 错误写法:第一个参数传了异常消息,未传入异常对象本身,Serilog无法采集堆栈、异常类型等信息
_logger.Error(ex.Message, $"Something went wrong:");

修正为正确的重载用法,将异常对象作为第一个参数传入:

// 正确写法
_logger.Error(ex, "Something went wrong");
// 如需额外携带消息参数可以用模板写法
// _logger.Error(ex, "Something went wrong, RequestPath: {Path}", httpContext.Request.Path);

Serilog会自动将异常的堆栈、类型、内部异常等信息一并写入Sink,不需要手动拼接异常消息。


2. Program.cs 配置错误

你Main方法中初始化Serilog时用到的configuration变量未声明构建,会导致Serilog初始化失败,同时缺少日志刷写逻辑:
修正后的Program.cs代码:

public static void Main(string[] args)
{
    // 先构建配置对象
    var configuration = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json")
        .AddEnvironmentVariables()
        .Build();
    
    Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(configuration)
        .CreateLogger();

    try
    {
        CreateHostBuilder(args).Build().Run();
    }
    catch (Exception ex)
    {
        Log.Fatal(ex, "Application terminated unexpectedly");
    }
    finally
    {
        // 确保程序退出前所有日志都刷写到Sink
        Log.CloseAndFlush();
    }
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .UseSerilog() // 已在Main中初始化配置,无需重复读取配置
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

3. Startup.cs 重复注册Application Insights

你重复注册了两次Application Insights服务,第二次无参注册会覆盖第一次的连接字符串配置,删除无参的注册行即可:

public void ConfigureServices(IServiceCollection services)
{
    // 只保留带连接字符串的注册
    services.AddApplicationInsightsTelemetry(Configuration["APPINSIGHTS_CONNECTIONSTRING"]);
}

同时注意ExceptionMiddleware要放在中间件管道的最顶部,确保能捕获所有下游中间件抛出的异常。


4. appsettings.json 配置缺失

4.1 缺少Sink程序集声明

Serilog.Using数组为空,Serilog无法加载Application Insights的Sink实现,补充对应程序集:

"Using": ["Serilog.Sinks.Console", "Serilog.Sinks.ApplicationInsights"],

4.2 Application Insights配置错误

当前配置用的是已不推荐的instrumentationKey,替换为连接字符串配置,和你注册服务时的配置保持一致:

{
  "Name": "ApplicationInsights",
  "Args": {
    "connectionString": "", // 填入你的Application Insights连接字符串
    "restrictedToMinimumLevel": "Information",
    "telemetryConverter": "Serilog.Sinks.ApplicationInsights.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter, Serilog.Sinks.ApplicationInsights"
  }
}

5. 异常中间件注入优化

你当前的中间件构造函数注入的ILogger未指定泛型,容易出现DI注入异常,直接使用Serilog静态上下文的Logger即可,修改构造函数:

public ExceptionMiddleware(RequestDelegate next)
{
    _next = next;
}

删除构造函数中对_logger的赋值逻辑,保留你预先初始化的private readonly ILogger _logger = Serilog.Log.ForContext<ExceptionMiddleware>();即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:24:03