删除 Serilog 输出中的默认属性
Removing Default Properties in Serilog Output
在一个文件的Serilog输出中,我看到默认是
{
"Timestamp": "2016-05-28T21:21:59.0932348+08:00",
"Level": "Information",
"MessageTemplate": "Processed {@Number} records in {@Time} ms",
"Properties": {
"Number": 500,
"Time": 120
}
}
有没有办法删除时间戳、级别、消息模板和属性,以便我只剩下这些
{
"Number": 500,
"Time": 120
}
Log.Logger 是这样分配的
Log.Logger = new LoggerConfiguration()
.WriteTo.Sink(new FileSink(ConfigurationManager.AppSettings["serilogPath"], new JsonFormatter(), null))
.CreateLogger();
谢谢
从 source code 来看,JsonFormatter 似乎不支持跳过这些默认属性。您可以创建自己的 ITextFormatter 来满足您的需求。这是一个简单的示例(不应在生产中使用,因为它不进行任何转义——仅用于演示目的):
public class SOFormatter : ITextFormatter
{
public void Format(LogEvent logEvent, TextWriter output)
{
output.Write("{");
foreach (var p in logEvent.Properties)
{
output.Write("\"{0}\" : {1}, ", p.Key, p.Value);
}
output.Write("}");
}
}
这个问题很老,但现在有一些简单的解决方案,所以我想分享一下。
确保你有这个Serilog.Expressions Nuget Package(至少3.3版)
您现在可以在代码中配置ExpressionTemplate
,这里是一个例子:
Log.Logger = new LoggerConfiguration()
.WriteTo.Console(formatter: new ExpressionTemplate("{ {@t, @mt, @r, @l: if @l = 'Information' then undefined() else @l, @x, ..@p} }\n"))
.CreateLogger();
或者你可以在appSettings.json
中配置ExpressionTemplate
,像这样
{
"Name": "Console",
"Args": {
"formatter": {
"type": "Serilog.Templates.ExpressionTemplate, Serilog.Expressions",
"template": "[{@t:HH:mm:ss} {@l:u3} {Coalesce(SourceContext, '<none>')}] {@m}\n{@x}"
}
}
}
备注
appSettings
中的 formatter
单词是方法参数的名称,因此根据您使用的接收器可能会有所不同。
例如,我使用 Mongodb Sink,所以参数的名称对我来说是 mongoDBJsonFormatter
我在这里不解释ExpressionTemplate
的语法,您可以参考以下链接了解更多信息。
这里 a good article 更详细地解释了这一点
-
在一个文件的Serilog输出中,我看到默认是
{
"Timestamp": "2016-05-28T21:21:59.0932348+08:00",
"Level": "Information",
"MessageTemplate": "Processed {@Number} records in {@Time} ms",
"Properties": {
"Number": 500,
"Time": 120
}
}
有没有办法删除时间戳、级别、消息模板和属性,以便我只剩下这些
{
"Number": 500,
"Time": 120
}
Log.Logger 是这样分配的
Log.Logger = new LoggerConfiguration()
.WriteTo.Sink(new FileSink(ConfigurationManager.AppSettings["serilogPath"], new JsonFormatter(), null))
.CreateLogger();
谢谢
从 source code 来看,JsonFormatter 似乎不支持跳过这些默认属性。您可以创建自己的 ITextFormatter 来满足您的需求。这是一个简单的示例(不应在生产中使用,因为它不进行任何转义——仅用于演示目的):
public class SOFormatter : ITextFormatter
{
public void Format(LogEvent logEvent, TextWriter output)
{
output.Write("{");
foreach (var p in logEvent.Properties)
{
output.Write("\"{0}\" : {1}, ", p.Key, p.Value);
}
output.Write("}");
}
}
这个问题很老,但现在有一些简单的解决方案,所以我想分享一下。
确保你有这个Serilog.Expressions Nuget Package(至少3.3版)
您现在可以在代码中配置
ExpressionTemplate
,这里是一个例子:Log.Logger = new LoggerConfiguration() .WriteTo.Console(formatter: new ExpressionTemplate("{ {@t, @mt, @r, @l: if @l = 'Information' then undefined() else @l, @x, ..@p} }\n")) .CreateLogger();
或者你可以在
appSettings.json
中配置ExpressionTemplate
,像这样{ "Name": "Console", "Args": { "formatter": { "type": "Serilog.Templates.ExpressionTemplate, Serilog.Expressions", "template": "[{@t:HH:mm:ss} {@l:u3} {Coalesce(SourceContext, '<none>')}] {@m}\n{@x}" } } }
备注
appSettings
中的formatter
单词是方法参数的名称,因此根据您使用的接收器可能会有所不同。
例如,我使用 Mongodb Sink,所以参数的名称对我来说是mongoDBJsonFormatter
我在这里不解释
ExpressionTemplate
的语法,您可以参考以下链接了解更多信息。这里 a good article 更详细地解释了这一点