java - Apache Log4j 自定义电子邮件附加程序未发送邮件,应用程序启动时出现错误通知

标签 java email logging log4j log4j2

我有一个应用程序,该应用程序的记录器配置为在设置标记时向所有应用程序管理员发送电子邮件。我们编写了一个自定义电子邮件附加程序来执行此操作,因为现有的 SMTPAppender 太不灵活,无法满足我们的需求。

本周早些时候,我们注意到没有从我们的 QA 服务器收到日志电子邮件,这在以前是经常发生的情况。我们的配置中没有任何内容让我眼前一亮,我很困惑。

这是 IDE 中应用程序启动的输出:

2015-10-07 14:26:11,344 ERROR Error processing element EMAIL: CLASS_NOT_FOUND
2015-10-07 14:26:11,435 ERROR Unable to locate appender Email for logger 
14:26:11.709 [main] INFO  c.q.app.services.server.data.h2.H2DbLifecycleManager - Starting DB on
connection jdbc:h2:tcp://localhost/C:/Users/jason/AppData/Local/appserver/store/data/db
2015-10-07 14:26:13,401 ERROR Error processing element EMAIL: CLASS_NOT_FOUND
2015-10-07 14:26:13,416 ERROR Unable to locate appender Email for logger 
Oct 07, 2015 2:26:14 PM org.hibernate.validator.internal.util.Version <clinit>
INFO: HV000001: Hibernate Validator 4.3.1.Final

该电子邮件附加程序在下面的 EMAIL block 中的配置中定义。 log4j.xml中的配置为

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <EMAIL name="Email">
            <PatternLayout pattern="%d{MMM dd, yyyy - HH:mm:ss}%n%msg%n"/>
            <MarkerFilter marker="NOTIFICATION_EMAIL" onMatch="ACCEPT" onMismatch="DENY"/>
        </EMAIL>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="Email"/>
        </Root>
        <Logger name="com.ning.http.client" level="warn">
            <AppenderRef ref="Console" />
        </Logger>
    </Loggers>
</Configuration>

自定义附加器定义为

/**
 * An appender used to send an email notification of a log event to all application Administrators.
 */
@Plugin(name = "EMAIL", category = "Core", elementType = "appender", printObject = true)
public class EmailAppender extends AbstractAppender
{

    /**
     * @param name - the name of the Appender.  Cannot be null
     * @param filter - The Filter or null (defaults to ThresholdFilter, level of ERROR).
     * @param layout - The layout to use - if not included it uses the default PatternLayout.
     * @return an appender for sending emails on logging events
     */
    @PluginFactory
    public static EmailAppender createAppender(@PluginAttribute("name") final String name, 
                                                @PluginElement("Filter") Filter filter, @PluginElement("Layout") Layout<? extends Serializable> layout)
    {
        if (name == null)
        {
            LOGGER.error("No name provided for NotificationAppender");
            return null;
        }

        if (filter == null)
            filter = ThresholdFilter.createFilter(null, null, null);

        if (layout == null)
            layout = PatternLayout.createDefaultLayout();

        return new EmailAppender(name, filter, layout);
    }

    protected EmailAppender(String name, Filter filter, Layout<? extends Serializable> layout)
    {
        super(name, filter, layout);
    }

    ...

}

一切似乎都按预期配置。但是,由于未知原因,EmailAppender 根本没有被编译或包含在构建中。有什么想法如何解决这个问题吗?

最佳答案

发布此答案以防有人遇到类似情况。

出于未知原因,Log4J 注释扫描器无法获取自定义附加器类,尽管类定义上有“@Plugin(name=...) 注释”。我没有经验或工具来深入探究原因,但找到了解决方案。

Configuration 标记添加 packages 限定符就可以解决问题,如下所示:

<Configuration status="WARN" packages="com.company.web.common.logging">

关于java - Apache Log4j 自定义电子邮件附加程序未发送邮件,应用程序启动时出现错误通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33000336/

相关文章:

java - 如何从 ArrayList 中删除特定数组

java - Applet 中的图像未显示在网页中

c# - 如何在C#中保存电子邮件附件

Git:发送电子邮件而不提交

java - 使用 log4j 配置进行日志记录不起作用

python - 在使用时间旋转记录器创建的每个日志文件中写入一个标题

java - 无界通配符类型在运行时如何工作?

JavaScript-如何基于Spring MVC显示后端系统的错误信息

html - 我可以检测 outlook 客户端并更改我的 html 电子邮件的样式吗?

java - java.util.logging.Logger 方法是否会在 Google App Engine 上失败?