2013-05-30 2 views
9

Вот фрагмент, содержащий мой Logback SMTPAppender:Почему Logback SMTPAppender отправляет только 1 электронное письмо?

<appender name="logManager-smtpAppender" class="ch.qos.logback.classic.net.SMTPAppender"> 
    <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
     <level>WARN</level> 
     <onMatch>ACCEPT</onMatch> 
     <onMismatch>NEUTRAL</onMismatch> 
    </filter> 
    <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
     <level>ERROR</level> 
     <onMatch>ACCEPT</onMatch> 
     <onMismatch>DENY</onMismatch> 
    </filter> 

    <asynchronousSending>false</asynchronousSending> 

    <smtpHost>my.smtp.host</smtpHost> 
    <to>[email protected]</to> 
    <from>[email protected]</from> 
    <username>my_smtp_user</username> 
    <password>my_smtp_password</password> 
    <subject>%logger{20} - %m</subject> 
    <layout class="ch.qos.logback.classic.html.HTMLLayout"/> 
    <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker"> 
     <bufferSize>1</bufferSize> 
    </cyclicBufferTracker> 
</appender> 

Когда следующий Java выполняет:

logger.warn("This is a warning."); 
logger.error("This is an error."); 

я получаю только 1 сообщение. Установив bufferSize в 1, я бы ожидал получить 2 разных сообщения электронной почты с одним единственным сообщением журнала в каждом из них. Что происходит?

ответ

8

Как уже отмечал Ceki, SMTPAPpender запускает сообщения электронной почты о событиях уровня ERROR. Для того, чтобы получить все журналы в одном почте, Вы можете увеличить размер буфера

Здесь за счет увеличения BufferSize до 10, вы получите последние 10 сообщений, записываемые вашей ошибки.

Проверить ссылку ниже: https://github.com/abdulwaheed18/Slf4jTutorial/blob/master/src/com/waheed/tutorial8/Application8.java https://github.com/abdulwaheed18/Slf4jTutorial/blob/master/sample8.xml

+0

Спасибо @Waheed (и +1 для образцов кода). Одна вещь, которую я все еще не получаю, заключается в следующем: что произойдет, если я увеличу значение bufferSize до 10, а затем запустим, скажем, 12 сообщений ERROR? Получу ли я 1 письмо с 10 сообщениями журнала? Если да, то что происходит с последними 2 сообщениями (10 + 2 = 12)? Еще раз спасибо! –

+1

Да, если вы установите значение bufferSize равным 10, вы получите только последние 10 сообщений. В основном мы используем SMTPAppender для уведомления admin/Ops о том, что что-то пошло не так в вашем приложении. Поэтому, как только он столкнулся с журналом ERROR, он отправит вам письмо с номерами журналов, которые вы установили. За журнал ERROR вы получите одну почту. – Waheed

+0

Еще раз спасибо (и +1!) Извините, хотя, не пытаясь быть вредителем здесь, но я до сих пор не понимаю, что произойдет с последними 2 сообщениями журнала. Скажем, у меня есть код, который вызывает 12 сообщений 'logger.error (" ... ")' в строке, а 'bufferSize' - 10. Как вы сказали, я бы получил 1 электронное письмо с 10 сообщениями ERROR. ** Но что происходит с последними 2 журналами ОШИБКИ? ** Еще раз спасибо за вашу помощь! –

5

Запуск исходящей электронной почты вычисляется с помощью «evaluator». По умолчанию SMTPAppender поставляется с OnErrorEvaluator, который запускает сообщения электронной почты о событиях уровня ERROR или выше. Таким образом, по умолчанию SMTPAppender отправит электронное письмо по второму сообщению (уровня ERROR), а не по первому (WARN). Чтобы инициировать исходящие сообщения WARN, напишите свой собственный оценщик. Вот код:

public class OnWarnEvaluator extends EventEvaluatorBase<ILoggingEvent> { 

public boolean evaluate(ILoggingEvent event) throws NullPointerException, 
      EvaluationException { 
    return event.getLevel().levelInt >= Level.WARN_INT; 
} 
} 
+0

Можно ли описать/настроить такое оценщик или sg. эквивалентно декларативно в 'log4j.xml' (для Log4J 2.1)? Я хотел бы получить по одному электронному письму на каждое сообщение журнала INFO и ERROR. – Drux

1

Для запуска исходящих сообщений в WARN без добавления новых исходных файлов, вы можете add the Janino dependency и его оценщик:

<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender"> 

    <evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator"> 
     <expression>return level >= WARN;</expression> 
    </evaluator> 
    ... 
</appender> 
Смежные вопросы