如何在Serilog中格式化结构化日志并忽略部分参数?
解决方法
Serilog没有原生支持“仅代入消息文本、不生成结构化属性”的占位符语法,但可以通过属性过滤的方式实现你要的效果,步骤如下:
1. 配置Serilog过滤规则
在初始化Serilog的代码中,添加过滤逻辑,移除名为_的日志属性:
Log.Logger = new LoggerConfiguration() .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200"))) // 过滤掉所有名为"_"的结构化属性 .Filter.ByExcluding(logEvent => logEvent.Properties.ContainsKey("_")) .CreateLogger();
2. 按需求编写日志代码
直接用{_}作为不需要生成结构化属性的占位符:
_logger.LogInformation("Logging the value of {_} and {bar}", foo, bar);
效果说明
- 日志消息文本会正常替换
{_}为foo的值、{bar}为bar的值,完全不影响可读性; - 发送到Elasticsearch的日志文档中,只会保留
bar对应的结构化属性,_对应的属性会被过滤掉,不会出现在ES里。
如果需要多个这类“仅代入不结构化”的参数,重复使用{_}即可——所有对应_的属性都会被过滤,消息文本的替换依然会按顺序正确执行。
内容的提问来源于stack exchange,提问作者Bergara
相关产品推荐
相关产品推荐

