我有一个应用程序,该应用程序的记录器配置为在设置标记时向所有应用程序管理员发送电子邮件。我们编写了一个自定义电子邮件附加程序来执行此操作,因为现有的 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/