9

我正在尝试为以下格式的 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 在消息模板中支持可选参数?

4

2 回答 2

0

您可以使用with条件块Serilog.Expressions来控制输出,以便仅将存在的属性写入输出,包括空格和分隔符。例如ExpressionTemplate

// using Serilog.Templates;

Log.Logger = new LoggerConfiguration()
    .WriteTo.Console(new ExpressionTemplate(
        "[{@t:HH:mm:ss}{#if ErrorId is not null} ({ErrorId}){#end}"))
    .CreateLogger();
于 2021-09-03T12:53:56.123 回答
0

我在我的应用程序中使用 Serilog,就像您注意到“缺失”的字段会在您观察到时“消失”,但这些占位符周围的字符格式不会。

我建议更改消息模板的格式,以便可选字段出现在后续行(可以忽略)或格式化,以便您不会注意到它们的缺失。

您还可以围绕由您的应用程序调用的 Serilog 日志记录方法(logger.Debug、logger.Warning、logger.Information 等)编写一个包装器,这些方法具有逻辑(或重载方法)以了解哪些值存在以及哪些值存在不存在。包装代码将提供适当的消息模板和正确的组合,以避免消息中出现多余的字符。

于 2015-11-17T23:33:26.707 回答