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();
}
}