Как зарегистрировать 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());
Что даст вам это в конце дня, и что мои друзья достаточно хороши для моих нужд.
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