Serilog - 如何手动将格式化消息呈现为字符串?

Serilog - How do I render formatted message to string manually?

我编写了一个日志记录框架,可以交替使用 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生成的输出作为字符串?

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

有什么建议吗?

分两步登录。

  1. 将日志消息写入 TextWriter 并从 文本编写器 (https://github.com/serilog/serilog/wiki/Provided-Sinks#textwriter)
  2. 将已经格式化的值写入真实记录器

虽然这可能有效,但我担心您的架构。听起来你对 Serilog 产生了巨大的依赖,同时你也在使用其他几个日志框架。选择一个日志框架或使用真正通用的功能。 C# 引入了字符串插值,不像 Serilogs 序列化等那样花哨,但可以工作。我会回到 KISS。

您可以像这样将 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) 应该会更好。正如另一位评论者所建议的那样,最好只在此处采用单个日志记录框架。