我对目前正在使用的当前日志记录解决方案非常满意,这是由NLOG实现的ServiceStack接口。我正在使用的NLOG目标如下:
的xsi:type = “控制台”
的xsi:type = “调试器”
的xsi:type = “文件”
的xsi:type = “SEQ”
特别重要的是Seq这是类固醇的日志接收器,也是我的服务实时发生的生命线。查询结构化日志的能力绝对太棒了,现在我想查询Seq日志,查找具有相同相关ID的所有消息,根据this post可以使用更丰富的内容:
using (LogContext.PushProperty("MessageId", GetCurrentMessageId()))
{
Log.Information("Processing {OrderId}", message.Order.Id);
// Later
Log.Information("Order processing complete");
}
<target name="seq" xsi:type="Seq" serverUrl="http://localhost:5341">
<property name="CallSite" value="${callsite}" />
<property name="Logger" value="${logger}" />
<property name="MachineName" value="${machinename}" />
<property name="ThreadId" value="${threadid}" as="number" />
<!-- would like to add the correlationId to the nlog properties here -->
</target>
使用ServiceStack接口,我没有看到这样做的方法,而是必须通过使每个日志语句在消息中包含correlationId来伪复制它。即_log.Warn(“CorrelationId:{0} Campaign =&gt;未找到trackingId”.Fmt(request.CorrelationId));
是否可以将correlationId作为头等公民/财产,以便Seq让我通过它进行查询?
根据@paaschpas回复
进行更新如果你在记录器界面上使用xxxxFormat方法(非常重要),你现在可以使用它并在顺序位置提供参数(一类脆弱的),例如:
if (_log.IsDebugEnabled)
_log.DebugFormat("CorrelationId:{0} CallReceived request:{1}", msgId, request.Dump());
这将在一天结束时给你,并且我的朋友对我的需求足够好。
答案 0 :(得分:3)
是否可以将correlationId作为头等公民/财产,以便Seq让我通过它进行查询?
根据this,它声明“你不能在你的NLog消息中使用命名属性来查询Seq,可以在查询中使用@ 0和@ 1占位符来识别{0}的参数和格式字符串中的{1}。“因此,如果您使用_log.Warn("CorrelationId:{0} Campaign => no trackingId found".Fmt(request.CorrelationId));
或ServiceStack log.WarnFormat("correlationid {0}", "correlationid");
的伪复制,则可以使用@0 == "correlationid"
使用ServiceStack界面,我看不到这样做的方法......
由于ServiceStack只调用NLog.LogManager.GetLogger(typeName)
而NLog似乎没有向LogContext.PushProperty
提供任何接口,我认为唯一的选择是按参数查询{0},{1},{2} ...等等。
答案 1 :(得分:1)
ServiceStack现在支持NLog(MDLC)+ Log4net + Serilog的PushProperty:
using (log.PushProperty("Hello", "World"))
{
log.InfoFormat("Message");
}
https://docs.servicestack.net/logging#logging-with-context
此功能自ServiceStack v5.1.0起可用
NLog 4.5还引入了structured logging和新的NLog.Targets.Seq