Низкая производительность при использовании Nlog по сравнению с log4net

Недавно мы обновили структуру ведения журнала для нашего основного веб-API-интерфейса donet с log4net до Nlog, и когда мы выполняем тестирование производительности / количество обработанных запросов в секунду, NLog намного меньше по сравнению с NLog. Ниже мой файл конфигурации Nlog.

Пожалуйста, предложите любые идеи по производительности, используя Nlog

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogLevel="info"
      internalLogFile="C:\temp\internal-nlog.txt">

  <!-- enable asp.net core layout renderers -->
  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
    <add assembly="SumoLogic.Logging.NLog"/>
  </extensions>

  <!-- the targets to write to -->
  <targets>
    <!-- write logs to console -->
    <target xsi:type="ColoredConsole" name="allConsole" formatMessage="false" layout="${longdate}|${level:uppercase=true}|${message}" />

    <target name="sumoLogic" type="SumoLogicTarget" formatMessage="false" layout="${date:format=yyyy-MM-dd HH\:mm\:ss.fff} ${level}, ${message}${exception:format=tostring}${newline}">
      <Url>#{Logging__SumoLogic__EndpointUrl}</Url>
      <ConnectionTimeout>30000</ConnectionTimeout>
      <SourceName>#{Logging__SumoLogic__SourceName}</SourceName>
      <SourceCategory>#{Logging__SumoLogic__SourceCategory}</SourceCategory>
      <UseConsoleLog>true</UseConsoleLog>
    </target>

    <target name="bufferedSumoLogic" type="BufferedSumoLogicTarget" formatMessage="false" layout="${date:format=yyyy-MM-dd HH\:mm\:ss.fff} ${level}, ${message}${exception:format=tostring}${newline}">
      <Url>#{Logging__SumoLogic__EndpointUrl}</Url>
      <SourceName>#{Logging__SumoLogic__SourceName}</SourceName>
      <SourceCategory>#{Logging__SumoLogic__SourceCategory}</SourceCategory>
      <ConnectionTimeout>30000</ConnectionTimeout>
      <RetryInterval>5000</RetryInterval>
      <MessagesPerRequest>10</MessagesPerRequest>
      <MaxFlushInterval>10000</MaxFlushInterval>
      <FlushingAccuracy>250</FlushingAccuracy>
      <MaxQueueSizeBytes>500000</MaxQueueSizeBytes>
      <UseConsoleLog>true</UseConsoleLog>
    </target>
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <!-- Skip non-critical Microsoft logs and so log only own logs -->
    <logger name="Microsoft.*" maxLevel="Info" final="true" />

    <!-- Write all debug messages to console -->
    <logger name="*" minlevel="#{Logging__ConsoleLog__LevelMin}" writeTo="allConsole" />

    <!-- Write to sumo buffered log -->
    <logger name="*" minlevel="#{Logging__BufferedLog__LevelMin}" maxlevel="#{Logging__BufferedLog__LevelMax}" writeTo="bufferedSumoLogic" />

    <!-- Write to sumo instant log -->
    <logger name="*" minlevel="#{Logging__InstantLog__LevelMin}" maxlevel="#{Logging__InstantLog__LevelMax}" writeTo="sumoLogic" />
  </rules>
</nlog>```

1 ответ

К сожалению, вы не можете ускорить то, что делают цели внутри, они могут выполнять веб-запросы, звонки в БД, записывать в файлы и т. Д. (И я думаю, что все в порядке), НО вы можете избежать блокировки потока приложения, из которого вы находитесь регистрация, это для меня важный вопрос здесь.

Просто добавь async="true" на ваш targets элемент, он должен читать:<targets async="true">

Небольшое объяснение по ссылке ниже:

Асинхронная целевая оболочка позволяет выполнять код регистратора быстрее, помещая в очередь сообщения и обрабатывая их в отдельном потоке. Вы должны объединить цели, которые проводят нетривиальное время в их методе Write(), с асинхронной целью, чтобы ускорить ведение журнала.

Также имейте в виду, что некоторые цели не работают должным образом в асинхронном режиме (вы узнаете, протестировав, в моем случае RollbarSharp), так что вы можете создать другой targets раздел для тех.

Вы можете получить больше информации здесь: https://github.com/nlog/NLog/wiki/AsyncWrapper-target

Удачи!

Другие вопросы по тегам