Log получает все свойства в пользовательской цели NLog

#c# #logging #.net-core #nlog

#c# #ведение журнала #.net-ядро #nlog

Вопрос:

У меня есть пользовательская AsyncTaskTarget цель NLog. На первый взгляд кажется, что все работает нормально. Я могу регистрировать все сообщения в своем пользовательском целевом классе.

Но я хотел бы иметь структурированное ведение журнала. Итак, я настроил свой nlog.config так в моем <target> :

 <layout xsi:type="JsonLayout">
  <attribute name="time" layout="${longdate}" />
  <attribute name="level" layout="${level:upperCase=true}"/>
  <attribute name="message" layout="${message}" />
  <attribute name="Properties" encode="false" >
    <layout type='JsonLayout' includeAllProperties="true" excludeProperties="EventId_Id,EventId_Name,EventId" maxRecursionLimit="5"/>
  </attribute>
</layout>
  

Есть ли способ также получить свойства, указанные в attribute тегах в методе журнала?

По какой-то причине значения свойств всегда равны нулю или пусты.

 protected override async Task WriteAsyncTask(IList<LogEventInfo> logEvents, CancellationToken cancellationToken)
{
    foreach (var info in logEvents)
    {
        string logMessage = RenderLogEvent(Layout, info); // renders message
        var props = GetAllProperties(info); // count = 0
        var p = GetContextProperties(info); // = null
    }
}
  

Комментарии:

1. Пожалуйста, поделитесь вызовом регистратора.

2. @Julian Ты имеешь в виду это: _logger.LogInformation($"Test info: {DateTime.Now}"); ? Это внутри класса контроллера.

Ответ №1:

Вы смешиваете две функции вместе. Вы зарегистрировали JsonLayout как target-Layout, поэтому он будет генерировать Json-документ для каждого события журнала.

 protected override async Task WriteAsyncTask(IList<LogEventInfo> logEvents, CancellationToken cancellationToken)
{
    foreach (var info in logEvents)
    {
        string jsonDocument = RenderLogEvent(Layout, info); // Renders using JsonLayout
        var props = GetAllProperties(info);               // Renders properties
    }
}
  

Вы можете настроить свою цель так, чтобы она возвращала свойства при вызове GetAllProperties() , но сначала вы должны включить ее следующим образом:

 <target type="MyFirst" name="first" includeEventProperties="true" includeMdlc="true">
  <contextproperty name="MachineName" layout="${machinename}" />
  <contextproperty name="ThreadId" layout="${threadid}" />
</target>
  

Смотрите также: https://github.com/NLog/NLog/wiki/How-to-write-a-custom-async-target