为什么Logback SMTPAppender只发送1封电子邮件?

9 java logging logback smtpappender

这是一个包含我的Logback的片段SMTPAppender:

<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>john.smith@example.com</to>
    <from>no-reply@example.com</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>
Run Code Online (Sandbox Code Playgroud)

当以下Java执行时:

logger.warn("This is a warning.");
logger.error("This is an error.");
Run Code Online (Sandbox Code Playgroud)

我只收到1封电子邮件.通过设置bufferSize为1,我希望在每个电子邮件中获得2个不同的电子邮件,每个电子邮件中包含1条单个日志消息.这是怎么回事?

Wah*_*eed 8

正如Ceki已经提到过SMTPAPpender会在级别错误的事件上触发电子邮件.要通过一封邮件获取所有日志,可以增加缓冲区大小

10

这里通过将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


Cek*_*eki 5

传出电子邮件的触发由" 评估者 " 计算.默认情况下,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;
 }
}
Run Code Online (Sandbox Code Playgroud)