NLog Буферная оболочка с PostSharp. Диагностика - PullRequest
1 голос
/ 22 января 2020

У меня есть набор служб 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, - нет.

Буду признателен за любые идеи о том, как решить эту проблему. .

Спасибо

1 Ответ

1 голос
/ 23 января 2020

Большая часть трассировки PostSharp, например, метода входа и выхода, выполняется на уровне трассировки или отладки.

Эта строка в конфигурации NLog

<defaultFilter>level >= LogLevel.Warn</defaultFilter>

делает так, чтобы только сообщения этого уровня или выше вызывают буфер гриппа sh. Цель consoleLog не имеет такого фильтра по умолчанию, поэтому она содержит сообщения PostSharp.

Если после этого в буфере будет указано значение flu sh, с сообщением об ошибке он будет содержать сообщения PostSharp.

...