如何配置Serilog向ElasticSearch写入整数类型的日志级别字段
解决Serilog ElasticSearch Sink输出Level为整数类型的方案
Serilog默认将日志级别LogEventLevel序列化为字符串输出到ElasticSearch,你可以通过以下两种方案实现输出整型Level字段:
方案1:自定义ElasticSearch格式化器(推荐)
该方案仅修改输出到ElasticSearch的日志格式,不会影响其他Sink(如SQL Server)的原有逻辑:
- 实现自定义的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); } }
- 在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,可以使用日志增强器提前修改日志属性:
- 实现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); } }
- 在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
相关产品推荐
相关产品推荐

