log4j2 SMTP Appender:如何将以前的消息包含在另一个级别?

时间:2014-01-14 13:55:32

标签: java logging log4j log4j2 smtpappender

我正在使用log4j2-beta9,我有以下配置(部分内容):

<Appenders>
    <SMTP name="Mailer" suppressExceptions="false"
          subject="${subject}" to="${receipients}" from="${from}"
          smtpHost="${smtpHost}" smtpPort="${smtpPort}"
          smtpProtocol="${smtpProtocol}" smtpUsername="${smtpUser}"
          smtpPassword="${smtpPassword}" smtpDebug="false" bufferSize="20">
        <PatternLayout>
            <pattern>%d{dd-MM-yyyy HH:mm:ss,SSS} %5p %m%n</pattern>
        </PatternLayout>
    </SMTP>

    <Async name="AsyncMailer">
        <AppenderRef ref="Mailer"/>
    </Async>
</Appenders>
<Loggers>
    <Root level="info">
        <AppenderRef ref="AsyncMailer" level="error"/>
    </Root>
</Loggers>

使用此配置,我只收到1(一)个错误消息的电子邮件。 如何配置log4j2以接收1个错误消息和N个先前的错误消息 LEVEL = INFO?

的消息

提前致谢。

1 个答案:

答案 0 :(得分:6)

这当前是不可能的:SMTP appender有一个buffer,它在通过电子邮件发送之前捕获日志事件,但它只捕获为目标级别配置的事件(在您的示例中为ERROR)。如果您将其更改为INFO,您将收到所有INFO级别日志消息的电子邮件通知(而不仅仅是ERROR级别消息之前的消息)。

您可以在log4j issue tracker或log4j用户邮件列表中将此提升为功能请求。


更正:我错误,错误,错误

STMP Appender确实有一个缓冲区,但它意味着捕获ERROR日志事件之前的最后一个X(默认为512)INFO,DEBUG,TRACE级别的消息。所以它应该像你期望的那样工作(就像log4j-1.x SMTP appender一样)。

SMTP Appender会在收到ERROR(或更严重)级别的日志事件时触发电子邮件。所以在你的配置中你应该只向这个appender发送ERROR级别的日志事件(或者你会错过它之前的INFO,DEBUG,TRACE事件)。

在您的配置中,将<AppenderRef ref="AsyncMailer" level="error"/>更改为<AppenderRef ref="AsyncMailer"/>

那应该解决这个问题。如果您仍然遇到问题,其他人reported会出现类似问题,并且显然通过在配置中添加ThresholdFilter找到了解决方法:

<Appenders>
    <SMTP name="Mailer" suppressExceptions="false"
          subject="${subject}" to="${receipients}" from="${from}"
          smtpHost="${smtpHost}" smtpPort="${smtpPort}"
          smtpProtocol="${smtpProtocol}" smtpUsername="${smtpUser}"
          smtpPassword="${smtpPassword}" smtpDebug="false" bufferSize="20">

        <ThresholdFilter level="debug" onMatch="NEUTRAL" onMismatch="DENY" /> 
        <PatternLayout>
            <pattern>%d{dd-MM-yyyy HH:mm:ss,SSS} %5p %m%n</pattern>
        </PatternLayout>
    </SMTP>

    <Async name="AsyncMailer">
        <AppenderRef ref="Mailer"/>
    </Async>
</Appenders>
<Loggers>
    <Root level="info">
        <AppenderRef ref="AsyncMailer" />
    </Root>
</Loggers>