2016-12-09 2 views
4

Я сейчас пересматриваю наши конфигурации NLog и, пытаясь установить наши цели async и использовать BufferingTarget для наших процессов обработки почты, я обнаружил, что Nlog не кажется очистите почту по закрытию приложения.NLog не сбрасывает буферизованные журналы, когда цели установлены как async

Вызов LogManager.Flush(); не работает, либо, это дает NLog.NLogRuntimeException:

Первый шанс исключение типа «NLog.NLogRuntimeException» произошло в NLog.dll Дополнительная информация: Асинхронный исключение произошло .

Я обнаружил, что удаление async="true" из targets сделало мои работы по настройке. Ниже приведена конфигурация и исходный код консоли, который я использовал для выполнения своих тестов.

Я видел, что существует довольно много сообщений, которые могут быть связаны с этим, относительно последовательности журналов и/или FallbackTarget, но они не помогли решить проблему, которая у меня есть.

Применение консоли

class Program 
{ 
    static void Main(string[] args) 
    { 
     Logger logger = LogManager.GetCurrentClassLogger(); 

     logger.Debug("Debug Message"); 
     logger.Debug("Debug Message"); 

     LogManager.Flush(); 
     LogManager.Shutdown(); 
    } 
} 

Конфигурация Nlog

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    internalLogFile="Logs\Nlogs.txt" 
    throwExceptions="true"> 

    <variable name="LongLayout" value="${longdate} | ${machinename} | ${logger} | ${callsite} (${callsite-linenumber}) | ${message}${onexception:${newline}${exception:format=Type}${newline}${newline}${exception:format=tostring}}"/> 
    <variable name="ShortLayout" value="${longdate} | ${callsite} (${callsite-linenumber}) | ${message}${onexception:${newline}${exception:format=Type}${newline}${newline}${exception:format=tostring}}"/> 

    <targets async="true"> 
     <target name="Console" xsi:type="ColoredConsole" layout="${ShortLayout}"/> 
     <target name="File" xsi:type="File" 
       fileName="${basedir}\Logs\${level}.log" 
       archiveFileName="${basedir}\Logs\Archives\${level}_${shortdate}_{##}.log" 
       archiveAboveSize="1000000" 
       layout="${LongLayout}"/> 
     <target name="MailBuffer" xsi:type="BufferingWrapper" flushTimeout="50000" slidingTimeout="false"> 
     <target name="Mail" xsi:type="Mail" 
       smtpServer="smtp.gmail.com" 
       smtpPort="587" 
       smtpAuthentication="Basic" 
       smtpUserName="username" 
       smtpPassword="password" 
       enableSsl="true" 
       from="from" 
       to="to" 
       subject="Service: ${machinename} | ${logger} | ${level}" 
       body="${LongLayout}${newline}"/> 
     </target> 
    </targets> 

    <rules> 
     <logger name="*" levels="Fatal,Error,Warn,Debug,Info,Trace" writeTo="Console" enabled="true" /> 
     <logger name="*" levels="Fatal,Error,Warn,Debug,Info,Trace" writeTo="File" enabled="true" /> 
     <logger name="*" levels="Fatal,Error,Warn,Debug,Info,Trace" writeTo="MailBuffer" enabled="true" /> 
    </rules>  
    </nlog> 

трассировки стека исключений

at NLog.Common.AsyncHelpers.RunSynchronously(AsynchronousAction action) 
    at NLog.LogFactory.Flush(TimeSpan timeout) 
    at NLog.LogFactory.Flush() 
    at NLog.LogManager.Flush() 
    at MyProject.NlogTests.Program.Main(String[] args) in p:...\Program.cs:line 15 

Nlog Log File (упрощенный)

2016-12-09 17:29:55.0471 Trace Opening \bin\Dev\\Logs\Info.log with allowFileSharedWriting=False 
2016-12-09 17:29:55.5354 Trace LogFactory.Flush(00:00:15) 
2016-12-09 17:29:55.5354 Trace Flushing all targets... 
2016-12-09 17:29:55.5354 Trace ForEachItemInParallel() 3 items 
2016-12-09 17:29:55.5819 Trace Flushing 1 events. 
2016-12-09 17:29:55.6119 Trace Opening \bin\Dev\\Logs\Info.log with allowFileSharedWriting=False 
2016-12-09 17:29:55.6209 Trace Continuation invoked: 
2016-12-09 17:29:55.6209 Trace Parallel task completed. 2 items remaining 
2016-12-09 17:29:55.6825 Trace Flushing 0 events. 
2016-12-09 17:29:55.6825 Trace Continuation invoked: 
2016-12-09 17:29:55.6825 Trace Parallel task completed. 1 items remaining 
2016-12-09 17:30:16.7442 Trace LogFactory.Flush(00:00:15) 
2016-12-09 17:30:16.7442 Trace Flushing all targets... 
2016-12-09 17:30:16.7702 Trace ForEachItemInParallel() 3 items 
2016-12-09 17:30:16.8032 Trace Flushing 0 events. 
2016-12-09 17:30:16.8032 Trace Flushing 0 events. 
2016-12-09 17:30:16.8032 Trace Continuation invoked: 
2016-12-09 17:30:16.8032 Trace Parallel task completed. 2 items remaining 
2016-12-09 17:30:16.8032 Trace Continuation invoked: 
2016-12-09 17:30:16.8032 Trace Continuation invoked: 
2016-12-09 17:30:16.8167 Trace Parallel task completed. 1 items remaining 
2016-12-09 17:30:16.8167 Trace Parallel task completed. 0 items remaining 
2016-12-09 17:30:16.8167 Info Shutting down logging... 
2016-12-09 17:30:16.8167 Info Closing old configuration. 
2016-12-09 17:30:16.8167 Trace LogFactory.Flush(00:00:15) 
2016-12-09 17:30:16.8167 Trace Flushing all targets... 
2016-12-09 17:30:16.8167 Trace ForEachItemInParallel() 3 items 
2016-12-09 17:30:16.8457 Trace Using basic authentication: Username='########@########.com' Password='********' 
2016-12-09 17:30:16.8472 Debug Sending mail to ########@########.com using smtp.gmail.com:587 (ssl=True) 
2016-12-09 17:30:16.8472 Trace Subject: 'Service: ####### | ######### | Info' 
2016-12-09 17:30:16.8472 Trace From: '########@########.com' 
+0

Не могли бы вы проверить внутреннюю регистрацию и/или внутренний журнал NLog? – Julian

+0

Привет @Julian, внутреннее исключение - это просто '{Timeout}'. Я добавил в трассу стека исключение NLog в описании в дополнение к журналу Nlog (упрощенное, чтобы избежать подробного описания). – Yannick

ответ

0

Я вижу, что тайм-аут по умолчанию составляет 15 секунд.

Вы можете попробовать увеличить таймаут.

например.

LogManager.Flush(TimeSpan.FromSeconds(60)); 
+0

Кажется, только дольше, прежде чем он сработает. Хорошая попытка, хотя. – Yannick

+0

Это может быть таймаут mailtarget? Если это еще проблема, если 500 секунд, то отправьте сообщение об ошибке: https://github.com/NLog/NLog/issues/new – Julian

+0

Я уверен, что это не mailtarget, так как если я удалю 'async = "true", тогда он отлично работает. Я попробую с 500 секундами, чтобы убедиться, и сообщит об ошибке, если она не работает. – Yannick

1

NLog ver. 4.4.1 теперь пытается мгновенно обработать ручную флеш, вместо того, чтобы ждать flushTimeout = «50000» BufferingWrapper.

+0

Мне нужно будет обновить мою версию и посмотреть, что произойдет потом. В последнее время не так много времени, чтобы проверить это. – Yannick

Смежные вопросы