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

.NET 8中Serilog对接ElasticSearch日志无法显示在Kibana的问题

.NET 8 日志无法显示在 Kibana 问题排查

使用的 NuGet 包

Serilog.AspNetCore
Serilog.Formatting.Elasticsearch
Serilog.Sinks.Async
Serilog.Sinks.Elasticsearch
Elastic.CommonSchema
Elastic.CommonSchema.Serilog

配置代码

日志扩展方法(含两种配置方式)

public static void AddElasticSearchSerilog(this WebApplicationBuilder builder)
{
    var elasticUri = builder.Configuration["ElasticSearch:Url"];
    var index = builder.Configuration["ElasticSearch:Index"];
    ElasticsearchSinkOptions options = new(new Uri(elasticUri!))
    {
        AutoRegisterTemplate = true,
        IndexFormat = $"{index}{DateTime.UtcNow:yyyy.MM.dd}",
        AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv7,
        CustomFormatter = new EcsTextFormatter()
    };

    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Debug()
        .Enrich.FromLogContext()
        .WriteTo.Console()
        .WriteTo.Elasticsearch(options)
        .CreateLogger();

    //builder.Host.UseSerilog((hostBuilder, loggerConfiguration) =>
    //{
    //    loggerConfiguration
    //        .ReadFrom.Configuration(hostBuilder.Configuration)
    //        .WriteTo.Console(new EcsTextFormatter())
    //        .WriteTo.Elasticsearch(options)
    //        .WriteTo.Debug()
    //        .WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day); ;
    //});
}

Program.cs 调用代码

builder.AddElasticSearchSerilog();

var app = builder.Build();

var logger = app.Services.GetRequiredService<ILogger<Program>>();
logger.LogInformation("The application is starting...");

appsettings.json 配置

"Serilog": {
  "MinimumLevel": {
    "Default": "Information",
    "Override": {
      "Microsoft": "Warning",
      "Serilog": "Debug"
    }
  }
},
"ElasticSearch": {
  "Url": "http://localhost:9200",
  "Index": "logs-api-dev-"
}

问题现象

  • 控制台正常显示日志,但 Kibana Discover 页面无数据
  • 已创建匹配到6个数据源的索引模式,选择@timestamp作为时间字段
  • Postman 手动写入的日志可正常显示,API 发送的日志无法显示

排查与解决步骤

1. 修复 Serilog 与 ASP.NET Core 日志系统的绑定

你当前启用的配置仅设置了Log.Logger,但未替换 ASP.NET Core 的默认日志提供器,导致通过ILogger<Program>写入的日志不会被 Serilog 捕获并发送到 ElasticSearch。

  • 改用注释掉的builder.Host.UseSerilog()配置,或者在设置Log.Logger后添加:
    builder.Host.UseSerilog(); // 替换默认日志提供器
    

2. 检查索引名称与时间范围匹配

当前IndexFormat使用DateTime.UtcNow:yyyy.MM.dd,会在应用启动时固定当天日期,跨天后需重启应用才生成新索引。

  • 调用 ElasticSearch API 查看实际写入的索引:
    GET /_cat/indices/logs-api-dev-*?v
    
  • 确认 Kibana Discover 页面选择的时间范围,是否包含这些索引的日志时间,建议切换时区为 UTC 再尝试(ECS 格式默认写入 UTC 时间)。

3. 启用 Serilog 自我日志排查写入错误

添加以下代码查看 ElasticSearch 写入是否存在异常:

Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));

启动应用后,控制台会输出 Serilog 自身的调试信息,可定位连接失败、权限不足、格式错误等问题。

4. 统一日志级别配置

如果使用第一种直接构建Log.Logger的方式,需手动配置日志级别覆盖,确保和 appsettings 配置一致:

.Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Information()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
    .Enrich.FromLogContext()
    .WriteTo.Console()
    .WriteTo.Elasticsearch(options)
    .CreateLogger();

5. 对比手动与 API 写入的日志结构

调用 ElasticSearch API 查看两类日志的文档结构,确认是否存在字段不兼容:

GET /logs-api-dev-2024.xx.xx/_search?q=*

重点检查@timestamp字段的格式是否符合 ISO 8601 标准,以及是否存在 Kibana 索引模式未包含的必填字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 13:36:06