如何在 Serilog 输出模板中创建可选属性?
Posted
技术标签:
【中文标题】如何在 Serilog 输出模板中创建可选属性?【英文标题】:How can I create an optional property in a Serilog output template? 【发布时间】:2015-09-11 05:16:19 【问题描述】:我正在尝试为以下格式的 serilog 消息创建全局输出模板:
Timestamp:yyyy-MM-dd HH:mm:ss,fff [ComponentName, ApplicationName, ThreadId] Level (ErrorId): Message Exception
我遇到的问题是,有些消息不包含错误 ID、异常或 ThreadId。因此,当这种情况发生时,我会收到一条消息,其中包含一堆字符,这些字符会给日志消息添加噪音,例如,
2015-06-24 15:11:03,234 [Component, MyApp, ] Info (): This is a message that I'm writing
是否可以让 Serilog 在消息模板中支持可选参数?
【问题讨论】:
【参考方案1】:您可以使用Serilog.Expressions
来控制输出,使用ExpressionTemplate
和conditional blocks,这样只有存在的属性才会写入输出,包括空格和分隔符。例如
// using Serilog.Templates;
Log.Logger = new LoggerConfiguration()
.WriteTo.Console(new ExpressionTemplate(
"[@t:HH:mm:ss#if ErrorId is not null (ErrorId)#end"))
.CreateLogger();
【讨论】:
【参考方案2】:我在我的应用程序中使用 Serilog,就像您注意到“缺失”字段会在您观察时“消失”,但这些占位符周围的字符格式不会。
我建议更改消息模板的格式,以便可选字段出现在后续行(可以忽略)或格式化,以便您不会注意到它们的缺失。
您还可以围绕由您的应用程序调用的 Serilog 日志记录方法(logger.Debug、logger.Warning、logger.Information 等)编写一个包装器,这些方法具有逻辑(或重载方法)来知道哪些值是存在的和不存在的。包装代码将提供适当的消息模板和正确的组合,以避免消息中出现多余的字符。
【讨论】:
以上是关于如何在 Serilog 输出模板中创建可选属性?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 React 中创建可排序的表?如何从排序的对象访问类方法?