我对我现在使用的当前日志记录解决方案非常满意,它是由 NLOG 实现的 ServiceStack 接口。我使用的 NLOG 目标如下:
xsi:type="控制台"
xsi:type="调试器"
xsi:type="文件"
xsi:type="序列"
特别重要的是Seq,它是类固醇的日志接收器,是我的生命线,可以实时了解我的服务发生的事情。查询结构化日志的能力非常棒,以至于现在我想查询 Seq 日志以查找具有相同相关 ID 的所有消息,根据这篇文章,这可以通过丰富器实现:
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 接口,我看不到这样做的方法,而是必须通过使每个日志语句在消息中包含相关性 ID 来伪复制它。ie _log.Warn("CorrelationId:{0} Campaign => no trackingId found".Fmt(request.CorrelationId));
是否可以让correlationId 成为一等公民/财产,以便Seq 让我通过它查询?
基于@paaschpas 答案的更新
鉴于如果您在记录器接口上使用 xxxxFormat 方法(非常重要),您现在可以使用它并在序数位置提供参数(有点脆弱),例如
if (_log.IsDebugEnabled)
_log.DebugFormat("CorrelationId:{0} CallReceived request:{1}", msgId, request.Dump());
这将在一天结束时给你这个,我的朋友们足以满足我的需要。