【问题标题】:Log4j2: SMTPAppender does not send mails with error or fatal levelLog4j2:SMTPAppender 不发送错误或致命级别的邮件
【发布时间】:2013-07-15 15:29:42
【问题描述】:

我发现 log4j2 中的 SMTPAppender 存在一些问题。每当创建级别为 errorfatal 的日志事件时没有在没有发送邮件并且致命事件消失之前没有级别为 info 的事件。

这是我的log4j2配置文件(log4j2.xml)和一个小程序(LogTest.java)重现问题:

<?xml version="1.0" encoding="UTF-8"?>
    <configuration status="warn">

        <!-- mail server configuration -->
        <properties>
            <property name="receipients">me@example.com</property>
            <property name="from">me@example.com</property>
            <property name="smtpHost">smtp.example.com</property>
            <property name="smtpPort">25</property>
            <property name="smtpProtocol">smtp</property>
            <property name="smtpUser">me</property>
            <property name="smtpPassword">secret</property>
        </properties>

    <appenders>

        <!-- appender to write all info events to stdout -->
        <Console name="Console" target="SYSTEM_OUT">
            <ThresholdFilter level="info" onMatch="NEUTRAL" onMismatch="DENY"/>
        </Console>

        <!-- appender to send mails (default: error and fatal events)-->
        <SMTP name="Mailer" suppressExceptions="false"
              subject="Error log" to="${receipients}" from="${from}"
              smtpHost="${smtpHost}" smtpPort="${smtpPort}"
              smtpProtocol="${smtpProtocol}" smtpUsername="${smtpUser}" 
              smtpPassword="${smtpPassword}" smtpDebug="false" bufferSize="2">
        </SMTP>
        <!-- appender to send mails asynchronously -->
        <Async name="AsyncMailer" > 
            <appender-ref ref="Mailer"/>
        </Async>

    </appenders>
    <loggers>

        <!-- logger to send mail on (at least) info level events -->
        <logger name="LogTest" level="info" additivity="true">
            <appender-ref ref="AsyncMailer"/>
        </logger>

        <!-- root logger to see what happens (info level and "above") -->
        <root level="info">
            <appender-ref ref="Console"/>
        </root>

    </loggers>
</configuration>

我用这个小程序重现问题(LogTest.java):

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

class LogTest
{
    private static Logger logger=LogManager.getLogger("LogTest");

    public void testlogger()
    {
        /* --> uncomment to enable first mail
        logger.info("test info 1");
        */
        logger.fatal("test fatal 1");

        /* --> uncomment to enable second mail
        logger.info("test info 2");
        */
        logger.fatal("test fatal 2");
    }

    public static void main(String[] args)
    {
        LogTest app=new LogTest();
        app.testlogger();
    }

}

如果您取消注释两个标记的位置,一切都会按预期工作:发送两封邮件 - 每封邮件都包含致命事件和先前的信息事件。此外,这 4 个事件被打印到标准输出:

test info 1
test fatal 1
test info 2
test fatal 2

现在,如果您只激活/取消注释第二个位置 - 第二封邮件 (fatal2) 会按预期发送(再次使用之前的 info2 事件),但即使第一个致命事件打印到标准输出,邮件也会被吃掉.输出如下:

test fatal 1
test info 2
test fatal 2

就我个人而言,似乎我遇到了问题并且配置错误的 log4j2 或者它可能是一个错误。

提前感谢您的帮助。

*约斯特

注意:

对于我使用从项目网站下载的log4j2-beta7 的测试。 可以在here找到文档。

【问题讨论】:

  • 更新:问题已于昨天(08/28/2013)修复 - 修复版本为 2.0-beta9

标签: java logging log4j2 smtpappender


【解决方案1】:

乍一看,这看起来像是一个错误。如果您删除 LogTest 记录器并像这样配置您的根记录器,它仍然会发生吗?

<root level="info">
    <appender-ref ref="Console"/>
    <appender-ref ref="AsyncMailer"/>
</root>

仅供参考,如果以后您需要在不同的附加程序上使用不同的日志级别,您可以像这样实现(不需要单独的记录器):

<root level="trace">
    <appender-ref ref="A" level="info" />
    <appender-ref ref="B" level="debug" />
</root>

【讨论】:

  • 首先感谢您的快速回答。是的 - 当我删除 LogTest 记录器时效果是一样的,所以它似乎是一个错误(至少在 log4j2-beta7 中)。我目前的解决方法是简单地生成一个信息事件以及一个致命或错误事件。
  • 我在project's issues website 开了一个问题(以防有人想跟踪它)。
  • 感谢您创建 Jira 票证。 -雷姆科
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多