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

ASP.NET Core 7下Serilog无法向Graylog记录异常问题求助

问题诊断与解决方案

核心原因分析

你的问题核心在于Serilog.Sinks.Graylog对Exception对象的处理逻辑,结合测试现象(转字符串可正常记录),主要有以下几个可能:

  1. Graylog Sink默认未启用Exception字段的序列化
  2. UDP传输的MTU限制导致包含堆栈的异常日志数据包被丢弃
  3. ASP.NET Core日志适配层的重复配置导致Exception信息丢失

分步解决方案

1. 检查并更新Serilog.Sinks.Graylog版本

旧版本的Graylog Sink存在Exception序列化bug,先确保使用最新稳定版(推荐v3.x以上),在NuGet包管理器中更新Serilog.Sinks.Graylog。

2. 显式配置Graylog Sink的Exception序列化

修改BuildLoggerConfiguration中的Graylog配置,添加PropertyFormatter并明确启用Exception包含:

private static Serilog.Core.Logger BuildLoggerConfiguration(IConfiguration configuration)
{
    return new LoggerConfiguration()
        .ReadFrom.Configuration(configuration)
        .Enrich.FromLogContext()
        .MinimumLevel.Is(LogEventLevel.Information)
        .MinimumLevel.Override("System", LogEventLevel.Warning)
        .MinimumLevel.Override("Microsoft", LogEventLevel.Error)
        .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning)
        .WriteTo.Console()
        .WriteTo.Graylog(new GraylogSinkOptions
        {
            HostnameOrAddress = "nice_server_ip",
            Port = 12201,
            TransportType = TransportType.Udp,
            MinimumLogEventLevel = LogEventLevel.Verbose,
            Facility = "my.facility",
            MessageGeneratorType = MessageIdGeneratorType.Timestamp,
            // 显式配置属性格式化器,确保Exception被序列化
            PropertyFormatter = new GraylogPropertyFormatter(
                includeMessageTemplate: true,
                includeProperties: true,
                includeException: true
            )
        })
        .CreateLogger();
}

3. 移除重复的日志配置

Program.cs中同时调用了builder.Host.AddUsageSerilog(configuration)和builder.Logging.AddSerilog(),这会导致ASP.NET Core日志系统重复适配,可能丢失Exception上下文。移除builder.Logging.AddSerilog();这一行即可。

4. 解决UDP传输大小限制问题

如果异常包含较长堆栈信息,UDP数据包可能超过默认MTU(通常1500字节)导致被丢弃,可尝试:

  • 改用TCP传输:将TransportType = TransportType.Tcp
  • 调整Graylog服务器的UDP接收缓冲区配置
  • 启用日志压缩(部分Graylog Sink版本支持)

5. 直接用Serilog日志对象测试

在全局过滤器中暂时改用Serilog静态日志对象测试,排除ASP.NET Core ILogger适配问题:

// 替换原ILogger调用
Serilog.Log.Error(context.Exception, "Api action failure.");

如果这样能正常记录到Graylog,说明问题出在ASP.NET Core日志适配层,需确保AddUsageSerilog的配置完全覆盖默认日志提供程序。

验证步骤

  1. 重启应用后触发异常
  2. 查看Graylog的Raw Message,确认是否包含exception字段
  3. 若仍未收到,检查Graylog服务器的UDP/TCP端口是否正常监听,以及防火墙规则是否允许流量通过

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 07:55:14