.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
相关产品推荐
相关产品推荐

