我编写了一个日志框架,可以交替使用 Log4Net、Nlog 和 Serilog。每次调用记录器都会在写入日志条目之前触发一个事件。这可以选择通过 SignalR 将条目推送到连接的 Web 客户端。

在添加 serilog 之前,我使用 string.Format 来获取格式化文本。现在伴随着巨大的解构带来了巨大的责任。 string.Format 显然不喜欢字符串中的 {@0} 或 {data}。

// log the event before engaging with the logger
LogEventBus.Handle(LogLevels.Info, DateTime.Now, msg, args);
if (DiagnosticLevel < level)
    return;
_logger.Info(msg, args);

有什么办法可以直接将 serilog 生成的输出作为字符串获取?

我开始编写一个内存接收器,但这远离了我基于事件的集中日志记录,并完全脱离了我实现的其他库。

有什么建议么?

最佳答案

您可以将 Serilog 的消息格式转换为标准的 .NET 格式字符串({0} 等),如下所示:

var parser = new MessageTemplateParser();
var template = parser.Parse(templateMessage);
var format = new StringBuilder();
var index = 0;
foreach (var tok in template.Tokens)
{
    if (tok is TextToken)
        format.Append(tok);
    else
        format.Append("{" + index++ + "}");
}
var netStyle = format.ToString();
一旦你有了一个标准的格式字符串,你就可以通过它或者将 string.Format()args 一起使用。
它不会非常高效 - 更深入地连接到 Serilog pipleine ( ILogEventEnricher ) 应该会更好。正如另一位评论者所建议的那样,在这里只采用一个日志记录框架可能会更好。

关于c# - Serilog - 如何手动将格式化消息呈现为字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35853003/

10-15 20:06