Мы исследовали проблему, когда запросы между 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)