【问题标题】:How to log a message correlation Id with ServiceStack.Logging ILog?如何使用 ServiceStack.Logging ILog 记录消息相关 ID?
【发布时间】:2015-04-10 01:58:12
【问题描述】:

我对目前使用的日志记录解决方案非常满意,它是由 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 接口,我看不到这样做的方法,而是必须通过使每个日志语句在消息中包含相关 ID 来伪复制它。即 _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());

这会在一天结束时给你这个,我的朋友们已经足够满足我的需要了。

【问题讨论】:

    标签: logging servicestack nlog serilog getseq


    【解决方案1】:

    是否可以让correlationId 成为一等公民/属性,以便Seq 让我通过它进行查询?

    根据this,它指出“您不能在 NLog 消息中使用命名属性在 Seq 中进行查询,@0 和 @1 占位符可以在查询中用于标识 {0} 和 {1 的参数} 在格式字符串中。”因此,如果您使用 _log.Warn("CorrelationId:{0} Campaign =&gt; 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}...等.

    【讨论】:

    • 有什么好笑的与否,是我读了几次那个页面,甚至打算在问题中说出来。无论出于何种原因,我的眼睛总是被“安装目标”及以下内容所吸引。
    • 哈!我一开始也错过了。靠近底部的带有@0 == "nblumhardt" 的屏幕截图引起了我的注意并让我仔细观察。很高兴您能够得到满足您需求的工作。
    【解决方案2】:

    ServiceStack 现在支持 PushProperty for NLog (MDLC) + Log4net + Serilog:

    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 一起使用

    【讨论】:

      猜你喜欢
      • 2019-08-08
      • 2012-06-20
      • 1970-01-01
      • 2010-09-14
      • 2014-07-08
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      相关资源
      最近更新 更多