我编写了一个日志框架,它可以互换地使用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生成的输出?
我开始编写内存接收器,但这远离了基于集中事件的日志记录,并完全脱离了我实现的其他库。
有什么建议吗?
答案 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)
分两步进行记录。
虽然这可行,但我担心你的架构。这听起来像yuo正在为Serilog创造巨大的依赖,同时你也在使用其他几个日志记录。选择一个日志框架或使用真正的通用功能。 C#引入了字符串插值,不像Serilogs序列化那样花哨,但有效。我回到KISS。