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生成的输出作为字符串?
我开始编写内存接收器,但它脱离了我基于事件的集中式日志记录,并完全脱离了我已经实现的其他库。
有什么建议吗?
分两步登录。
- 将日志消息写入 TextWriter 并从
文本编写器
(https://github.com/serilog/serilog/wiki/Provided-Sinks#textwriter)
- 将已经格式化的值写入真实记录器
虽然这可能有效,但我担心您的架构。听起来你对 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
) 应该会更好。正如另一位评论者所建议的那样,最好只在此处采用单个日志记录框架。
我编写了一个日志记录框架,可以交替使用 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生成的输出作为字符串?
我开始编写内存接收器,但它脱离了我基于事件的集中式日志记录,并完全脱离了我已经实现的其他库。
有什么建议吗?
分两步登录。
- 将日志消息写入 TextWriter 并从 文本编写器 (https://github.com/serilog/serilog/wiki/Provided-Sinks#textwriter)
- 将已经格式化的值写入真实记录器
虽然这可能有效,但我担心您的架构。听起来你对 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
) 应该会更好。正如另一位评论者所建议的那样,最好只在此处采用单个日志记录框架。