Как зарегистрировать Id корреляции сообщений с ServiceStack.Logging ILog?

Я очень доволен текущим решением для ведения журнала, которое у меня сейчас есть, а именно интерфейсом ServiceStack, реализуемым NLOG. Цели NLOG, которые я использую, следующие:

XSI: тип ="Консоль"

XSI: тип ="Debugger"

XSI: тип ="Файл"

XSI: тип ="Seq"

Особое значение имеет 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, я не вижу способа сделать это таким образом, но вместо этого пришлось бы псевдореплицировать его, сделав так, чтобы каждый оператор журнала содержал в сообщении идентификатор корреляции. то есть _log.Warn("CorrelationId:{0} Campaign => отслеживание не найдено".Fmt(request.CorrelationId));

Есть ли где-нибудь, чтобы сделать correlationId первоклассным гражданином / имуществом, чтобы Seq позволил мне запросить его?

Обновление основано на ответе @paaschpas

Учитывая, что если вы используете методы xxxxFormat в интерфейсе регистратора (очень важно), вы можете теперь использовать это и предоставлять параметры в порядковом положении (вроде хрупкого), например

if (_log.IsDebugEnabled)
    _log.DebugFormat("CorrelationId:{0} CallReceived request:{1}", msgId, request.Dump());

Что даст вам это Seq фильтруется по corrId в конце дня, и что мои друзья достаточно хороши для моих нужд.

1 ответ

Решение

Есть ли где-нибудь, чтобы сделать correlationId первоклассным гражданином / имуществом, чтобы Seq позволил мне запросить его?

В соответствии с этим говорится, что "вы не можете использовать именованные свойства в своих сообщениях NLog для запросов в Seq, заполнители @0 и @1 можно использовать в запросах для определения параметров для {0} и {1} в строках формата." Так что если вы используете свою псевдо-копию _log.Warn("CorrelationId:{0} Campaign => no trackingId found".Fmt(request.CorrelationId)); или ServiceStack's log.WarnFormat("correlationid {0}", "correlationid"); Вы можете запросить / отфильтровать, используя @0 == "correlationid"

Используя интерфейс ServiceStack, я не вижу способа сделать это таким образом...

Так как ServiceStack просто вызывает NLog.LogManager.GetLogger(typeName) и NLog не предлагает никакого интерфейса в LogContext.PushProperty Я думаю, что единственный вариант - это запросить по параметрам {0}, {1}, {2}... и т. Д.

ServiceStack теперь поддерживает PushProperty для NLog (MDLC) + Log4net + Serilog:

using (log.PushProperty("Hello", "World"))
{
    log.InfoFormat("Message");
}

https://docs.servicestack.net/logging

Эта функция была доступна с ServiceStack v5.1.0

Также NLog 4.5 представляет структурированное ведение журнала, которое работает вместе с новым NLog.Targets.Seq

Другие вопросы по тегам