#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