У меня есть набор служб REST, которые служат в качестве API для клиента. Написано в. NET Core 2.2. У меня проблемы с выяснением того, как настроить ведение журнала для работы с BufferingWrapper с использованием Postsharp для генерации сообщений и NLog в качестве бэкэнда ведения журнала. Цель состоит в том, чтобы позволить BufferingWrapper выгружать сообщения журнала независимо от уровня журнала в случае возникновения ошибки.
Вот подробности.
Я использую PostSharp. Диагностика для создания сообщений журнала.
Это мое определение GlobalAspect.
[assembly: Log("default", AttributeTargetTypes = "My.Namespace.Bl.*", AttributePriority = 1, AttributeTargetMemberAttributes = MulticastAttributes.Protected | MulticastAttributes.Public)]
[assembly: Log(AttributePriority = 2, AttributeExclude = true, AttributeTargetMembers = "get_*")]
[assembly: Log(AttributePriority = 3, AttributeExclude = true, AttributeTargetMembers = "set_*")]
[assembly: Log(AttributePriority = 4, AttributeExclude = true, AttributeTargetMembers = "*ctor*")]
Это мой профиль регистрации в файле PostSharp.config.
<Logging xmlns="clr-namespace:PostSharp.Patterns.Diagnostics;assembly:PostSharp.Patterns.Diagnostics">
<Profiles>
<LoggingProfile Name="default" IncludeExecutionTime="True">
<DefaultOptions>
<LoggingOptions IncludeParameterType="True" IncludeParameterName="True" />
</DefaultOptions>
</LoggingProfile>
</Profiles>
</Logging>
Я создал консольный журнал и BuffingWrapper для моей цели в файле nlog.config.
<wrapper-target name="buffer" xsi:type="BufferingWrapper" bufferSize="50" overflowAction="Flush" flushTimeout="1000">
<wrapper-target xsi:type="PostFilteringWrapper">
<defaultFilter>level >= LogLevel.Warn</defaultFilter>
<when exists="level >= LogLevel.Error" filter="level >= LogLevel.Trace" />
<target xsi:type="File" fileName="${var:logDirectory}/MyLogFile-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
</wrapper-target>
</wrapper-target>
<target xsi:type="ColoredConsole"
name="consoleLog"
layout="${longdate}|${threadid}|${mdlc:item=EventTier}|${machinename}|${uppercase:${level}}|${message} ${exception:format=message}" />
<rules>
<logger name="*" minlevel="Trace" writeTo="buffer" >
<logger name="*" minlevel="Trace" writeTo="consoleLog" />
</rules
Запуск исключения может быть выполнен путем отправки значения поля, которое больше, чем размер поля базы данных. Когда это происходит, в консольном журнале, который регистрирует все, отображаются все сообщения журнала, как и ожидалось, в том числе и сгенерированные Postsharp. Регистратор буфера показывает сообщения журнала, которые специально написаны (например, _logger.LogError («что-то плохое случилось»)), но не те, которые генерируются Postsharp. Он также показывает те сообщения об ошибках, которые генерируются Entity Framework об исключении.
Что я пробовал
Я использую Microsoft.Extensions.Logging. Я установил это в соответствии с инструкциями здесь . Классы журналирования вводятся в класс с помощью DI. Существует несколько явных операторов регистрации, но большинство журналов генерируются Postsharp. Результаты описаны выше.
Далее я попытался не использовать Microsoft.Extensions.Logging и использовать только NLog. Те же результаты.
Я создал меньшую консольную программу для проверки буфера. Я получаю те же результаты. Сообщения журнала, которые я создаю явным образом (например, _logger.LogInformation («Я сделал вещь.»)), Сохраняются в буфере, а сообщения, созданные с помощью Postsharp, - нет.
Буду признателен за любые идеи о том, как решить эту проблему. .
Спасибо