Почему использование Nlog ArchiveEvery Hour убивает мой Windows-сервис .Net, когда Archive Every Day работал нормально? - PullRequest
0 голосов
/ 12 ноября 2019

Мы исследовали проблему, когда запросы между 00:00 и 00:05 часами обрабатываются с задержкой. Мы обнаружили, что Nlog пытается одновременно архивировать данные за весь день (10 ГБ) и вносит свой вклад в проблему. Более частое архивирование позволит избежать перегрузки Nlog, что может решить проблему. Что нужно изменить в конфигурации, чтобы использовать архив чаще, чем раз в день?

Я изменил атрибут ArchiveEvery, установленный на Hour from Day, и заметил, что проблема исчезла. Но служба начала зависать иногда, когда происходит прокрутка с новой конфигурацией

Код «как есть», вызывающий задержку:

<nlog throwExceptions="true">
    <targets>
      </target>
      <target name="PointServiceHandlerMetrics" type="AsyncWrapper" queueLimit="5000" overflowAction="Discard">
        <target type="BufferingWrapper" name="file" bufferSize="120">
          <target type="File"
                  fileName="${basedir}/logs/PointServiceHandlerMetrics.log"
                  layout="${longdate} ${exception:format=tostring} ${message} ${newline}"
                  archiveFileName="D:/Application_Logs_Archive/PointServiceHandlerMetrics_{##}.log"
                  archiveEvery="Day"
                  archiveNumbering="Rolling"
                  maxArchiveFiles="3"
                  keepFileOpen="true"
                  concurrentWrites="true"
                  openFileCacheTimeout="600" />
        </target>
      </target>
    </targets>
    <rules>
      <logger name="PointServiceHandlerMetrics" minlevel="Info" writeTo="PointServiceHandlerMetrics"/>
    </rules>
  </nlog>

Ниже предпринимается попытка исправить, но иногда происходит зависание службы.

<nlog throwExceptions="true">
    <targets>
      </target>
      <target name="PointServiceHandlerMetrics" type="AsyncWrapper" queueLimit="5000" overflowAction="Discard">
        <target type="BufferingWrapper" name="file" bufferSize="120">
          <target type="File"
                  fileName="${basedir}/logs/PointServiceHandlerMetrics.log"
                  layout="${longdate} ${exception:format=tostring} ${message} ${newline}"
                  archiveFileName="D:/Application_Logs_Archive/PointServiceHandlerMetrics_{##}.log"
                  archiveEvery="Hour"
                  concurrentWrites="true"
                  archiveNumbering="Rolling"
                  maxArchiveFiles="3"
                  keepFileOpen="true"
                  concurrentWrites="true"
                  openFileCacheTimeout="600" />
        </target>
      </target>
    </targets>
    <rules>
      <logger name="PointServiceHandlerMetrics" minlevel="Info" writeTo="PointServiceHandlerMetrics"/>
    </rules>
  </nlog>

Я не вижу задержки, когда ArchiveEvery установлен в Hour. Но служба иногда зависает с приведенной ниже ошибкой.

Описание: процесс был прерван из-за необработанного исключения.

Информация об исключении: System.UnauthorizedAccessException Stack: at NLog.Targets. Target.WriteAsyncThreadSafe (NLog.Common.AsyncLogEventInfo) при NLog.Targets.Target.WriteAsyncLogEvent (NLog.Common.AsyncLogEventInfo) при NLog.LoggerImpl.WriteToTargetWithFilterChain (NLog.Internal.TargetWithFilterChain, NLog.LogEventInfo, NLog.Common.AsyncContinuation) в NLog.LoggerImpl.Write (System.Type, NLog.Internal.TargetWithFilterChain, NLog.LogEventInfo, NLog.LogFactory)

...