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

时间:2016-03-07 20:06:54

标签: c# logging serilog

我编写了一个日志框架,它可以互换地使用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生成的输出?

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

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

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

var parser = new MessageTemplateParser();
var template = parser.Parse(template);
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)应该会更好。正如另一位评论者所建议的那样,在这里采用单一的日志框架可能更好。

答案 1 :(得分:0)

分两步进行记录。

  1. 将日志消息写入TextWriter并从中读取值 的TextWriter (https://github.com/serilog/serilog/wiki/Provided-Sinks#textwriter
  2. 将已格式化的值写入真实记录器
  3. 虽然这可行,但我担心你的架构。这听起来像yuo正在为Serilog创造巨大的依赖,同时你也在使用其他几个日志记录。选择一个日志框架或使用真正的通用功能。 C#引入了字符串插值,不像Serilogs序列化那样花哨,但有效。我回到KISS。