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

Elastic.Serilog.Sinks索引配置及发布失败问题求助

问题解决:Elastic.Serilog.Sinks 发布失败与自定义索引配置

1. 解决发布失败问题

你遇到的 Failed publish over channel: EcsDataStreamChannel1错误,是因为默认情况下Elastic.Serilog.Sinks` 使用 ECS数据流(Data Stream) 模式,但你的Elasticsearch环境可能未配置对应的数据流,或权限不足。切换到普通索引模式即可解决该问题,同时也能支持自定义索引格式。

2. 配置自定义索引格式(如 my-log-{0:yyyy.MM})

修改你的代码,添加以下关键配置:

var uris = new List<Uri>() { new Uri("http://a-good-url:9200") };
var loggerConfig = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration, options)
    .WriteTo.Elasticsearch(uris, o =>
    {
        o.ChannelDiagnosticsCallback = l => { SelfLog.WriteLine($"Failure={l.PublishSuccess}, Message={l}, Exception={l.ObservedException}"); };
        o.BootstrapMethod = BootstrapMethod.IndexTemplate; // 让Sink自动创建匹配的索引模板
        o.MinimumLevel = LogEventLevel.Information;
        o.UseDataStreams = false; // 禁用数据流,使用普通索引
        // 自定义索引名称格式,按日志时间戳的年月生成索引
        o.IndexNameFormatter = (logEvent, formatter) => formatter.Format("my-log-{0:yyyy.MM}", logEvent.Timestamp);
        o.ConfigureChannel = channel =>
        {
            channel.ExportResponseCallback = (response, buffer) => SelfLog.WriteLine($"Written {buffer.Count} logs to Elasticsearch: {response.ApiCallDetails.HttpStatusCode}");
        };
    });

Log.Logger = loggerConfig.CreateLogger();

关键配置说明:

  • UseDataStreams = false: 关闭数据流模式,启用普通索引模式,这是使用自定义索引格式的前提。
  • IndexNameFormatter: 定义索引名称的格式化规则,通过日志事件的时间戳动态生成带年月的索引名(如 my-log-2024.05)。
  • BootstrapMethod.IndexTemplate: 让Sink自动创建匹配你索引模式的索引模板,确保索引的映射和设置符合要求(如果不需要自动创建,可改为 BootstrapMethod.Failure)。

额外检查项

  • 确认Elasticsearch地址 http://a-good-url:9200 可正常访问,且应用有写入索引的权限。
  • 确保代码中实际输出了符合 Information 级别及以上的日志(如 Log.Information("测试日志"))。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:45:09