SMTP-приложение Log4Net отправляет электронную почту только при ошибке с полным журналом (отладка, информация и ошибка).Только когда приложение заканчивается - PullRequest
9 голосов
/ 05 мая 2011

Я пытаюсь настроить приложение smtp в имеющемся у меня файле log4net.config. Проблема в том, что я просмотрел весь Интернет и не могу найти способ отправки электронного письма, когда возникает ошибка со всей другой включенной информацией журнала, такой как информация, отладка, ошибка, фатальная. Только когда приложение заканчивается (НЕ каждый раз, когда возникает ОШИБКА).

Так что я хочу получать это письмо только когда: Приложение заканчивается + Со всей информацией журнала (DEBUG, INFO, ERROR, FATAL) + Только если произошла ОШИБКА.

Более детальная проработка объясняется тем, как я обрабатываю свои исключения с помощью c sharp, с многоуровневой обработкой повсеместно, и поэтому, если возникает ошибка, независимо от того, сколько раз я хочу получить только одно электронное письмо. Также я не хочу использовать несколько журналов, а скорее только один в корне.

Спасибо.

Ответы [ 3 ]

6 голосов
/ 06 мая 2011

SmtpAppender не может сделать это самостоятельно. Поэтому я создал еще один appender для приложения типа MemoryAppender. Я установил порог для этого регистратора, чтобы он включал только те сообщения, которые должны вызывать SmtpAppender, например, Error. Мы используем это, чтобы позже определить, хотим ли мы отправить электронное письмо, в котором зарегистрировано больше уровней.

На самом деле мы не заботимся о сообщениях в MemoryAppender - мы просто заботимся о том, чтобы в конце они содержали сообщения. Сообщения, которые мы получаем по электронной почте, на самом деле приходят от SmtpAppender.

В конце моей программы я проверяю приложение памяти, чтобы увидеть, содержит ли его GetEvents () какие-либо события. Если это так, я не прекращаю нормальную работу SmtpAppender.

Конфигурации Log4Net для обоих приложений:

<appender name="ErrorHolder" type="log4net.Appender.MemoryAppender" >
    <onlyFixPartialEventData value="true" />
    <!-- if *any* message is logged with this level, the email appender will 
         be used with its own level -->
    <threshold value="ERROR" />
</appender>

<appender name="Email" type="log4net.Appender.SmtpAppender">    
    <!-- the level you want to see in the email IF ErrorHolder finds anything -->
    <threshold value="INFO"/> 
    <bufferSize value="512" />
    <lossy value="false" /> <!-- important! -->   
    <to value="name@domain.com" />
    <from value="name@domain.com" />
    <subject value="ERROR: subject" />
    <smtpHost value="smtpserver" />    
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" />
    </layout>    
</appender>

<root>
  <level value="ALL" />
  <appender-ref ref="ErrorHolder" />
  <appender-ref ref="Email" />
</root>

В конце приложения запустите это, чтобы отключить SmtpAppender, если приложение ErrorHolder пусто:

// trigger loggers if errors occurred:
var memoryAppender = ((Hierarchy)LogManager.GetRepository())
    .Root.Appenders.OfType<MemoryAppender>().FirstOrDefault();

if (memoryAppender != null && memoryAppender.GetEvents().Length == 0)
{
    // there was no error so don't email anything
    var smtpAppender = ((Hierarchy)LogManager.GetRepository())
        .Root.Appenders.OfType<SmtpAppender>().FirstOrDefault();

    if (smtpAppender != null)
    {
        smtpAppender.Threshold = Level.Off;
        smtpAppender.ActivateOptions();
    }
}
2 голосов
/ 05 мая 2011

Звучит как проблема конфигурации приложения, а не как проблема конфигурации log4net. Я бы предложил добавить метод в конце вашего приложения, который отправит вам файл журнала по электронной почте, если он обнаружит, что в нем есть ошибка. Вы можете либо обнаружить эту ошибку, переключив глобальную переменную с false на true в каждом месте, где вы регистрируете ошибки, либо подождать до конца вашего приложения, а затем прочитать файл журнала, чтобы увидеть, содержит ли он ошибки. Первый способ будет быстрее при закрытии, но это означает, что нужно изменить код в нескольких местах. Последний позволит вам просто добавить один метод, но это может занять больше времени в большом файле.

Третий вариант - отправлять ошибки во второй файл журнала (чтобы они шли в двух местах), используя log4net. Затем, когда ваше приложение закрывается и вы проверяете, следует ли отправлять журнал по электронной почте, просто проверьте наличие файла только для ошибок. Если он существует, удалите его (чтобы его не было в следующий раз) и отправьте полный журнал по электронной почте.

0 голосов
/ 18 февраля 2016

изменить порог на ошибку.Также журнал 4net отправляет электронное письмо только тогда, когда приложение закрыто. Вы можете отправить его раньше.но сначала вам нужно скопировать его (потому что файл org все еще используется), а затем вы можете отправить копию по электронной почте.

...