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

如何配置Serilog向ElasticSearch写入整数类型的日志级别字段

解决Serilog ElasticSearch Sink输出Level为整数类型的方案

Serilog默认将日志级别LogEventLevel序列化为字符串输出到ElasticSearch,你可以通过以下两种方案实现输出整型Level字段:

方案1:自定义ElasticSearch格式化器(推荐)

该方案仅修改输出到ElasticSearch的日志格式,不会影响其他Sink(如SQL Server)的原有逻辑:

  1. 实现自定义的JSON格式化类
using Serilog.Events;
using Serilog.Sinks.Elasticsearch;
using System.IO;

public class CustomElasticsearchJsonFormatter : ElasticsearchJsonFormatter
{
    // 构造函数参数可根据你的原有配置调整,比如是否渲染消息模板、是否包含字段前缀等
    public CustomElasticsearchJsonFormatter() : base(renderMessage: true) { }

    protected override void WriteLogEvent(LogEvent logEvent, TextWriter output)
    {
        // 替换原有的字符串类型Level为整型
        logEvent.AddOrUpdateProperty(new LogEventProperty("Level", new ScalarValue((int)logEvent.Level)));
        base.WriteLogEvent(logEvent, output);
    }
}
  1. 在Serilog配置中替换ES Sink的默认格式化器
Log.Logger = new LoggerConfiguration()
    // 保留你原有的SQL Server Sink配置不变
    .WriteTo.MSSqlServer(/* 原有配置 */)
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("你的ElasticSearch服务地址"))
    {
        IndexFormat = "你的日志索引名称",
        // 指定使用自定义格式化器
        CustomFormatter = new CustomElasticsearchJsonFormatter(),
        // 保留你原有其他ES Sink配置
    })
    // 保留你原有其他Serilog配置(如最低级别、其他Enricher等)
    .CreateLogger();

方案2:通过Enricher全局替换Level字段

如果你需要所有Sink都输出整型Level,可以使用日志增强器提前修改日志属性:

  1. 实现Level转换增强器
using Serilog.Core;
using Serilog.Events;

public class LevelAsIntEnricher : ILogEventEnricher
{
    public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
    {
        // 移除默认的字符串Level属性
        logEvent.RemovePropertyIfPresent("Level");
        // 添加整型Level属性
        var levelProperty = propertyFactory.CreateProperty("Level", (int)logEvent.Level);
        logEvent.AddPropertyIfAbsent(levelProperty);
    }
}
  1. 在Serilog配置中注册增强器
Log.Logger = new LoggerConfiguration()
    .Enrich.With<LevelAsIntEnricher>()
    // 剩余其他配置保持不变
    .CreateLogger();

注意事项

如果你的SQL Server中存储的Level整数和Serilog默认的LogEventLevel枚举值(Verbose=0、Debug=1、Information=2、Warning=3、Error=4、Fatal=5)不匹配,可自行调整映射逻辑:

int customLevel = logEvent.Level switch
{
    LogEventLevel.Verbose => 10,
    LogEventLevel.Debug => 20,
    LogEventLevel.Information => 30,
    LogEventLevel.Warning => 40,
    LogEventLevel.Error => 50,
    LogEventLevel.Fatal => 60,
    _ => 0
};

如果你的ElasticSearch索引中字段名为小写level,只需把上述代码中的属性名"Level"改为"level"即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:15:01