【问题标题】:Log4J2 Factory Error when attempting to use SMTP Appender尝试使用 SMTP Appender 时出现 Log4J2 工厂错误
【发布时间】:2015-05-19 19:21:50
【问题描述】:

下午好,

当我尝试使用 SMTP Appender 时,我在控制台中收到一个奇怪的错误。加载 XML 文件时似乎会发生该错误,因为它没有通过除 stdout 之外的任何输出流进行记录。 appender 的内容如下(我已经确认错误在这个 XML 块中)。我已经删除了我们的服务器信息。

<SMTP name="Mailer">
    <Subject>[ERROR] (software name) on ${hostName} has thrown a fatal error</Subject>
    <To>(a valid email in the form of a@a.com)</To>
    <From>(a valid email in the form of a@a.com)</From>
    <SMTPHost>(The Internal IP address of a server in the form of 192.168.0.1)</SMTPHost>
    <SMTPPort>587</SMTPPort>
    <BufferSize>512</BufferSize>
</SMTP>

无论它是否在记录器中被引用,在运行程序并从日志管理器运行 getLogger 时,我都会立即收到以下错误。我删除了几个文件名,并将它们替换为该文件当时正在做什么的粗略描述。

2015-05-19 19:08:18,812 错误无法为元素 SMTP 调用类 org.apache.logging.log4j.core.appender.SmtpAppender 中的工厂方法。 java.lang.reflect.InvocationTargetException 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:137) 在 org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:766) 在 org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:706) 在 org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:698) 在 org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:358) 在 org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:161) 在 org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:361) 在 org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:426) 在 org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:442) 在 org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:138) 在 org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:147) 在 org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:41) 在 org.apache.logging.log4j.LogManager.getContext(LogManager.java:175) 在 org.apache.logging.log4j.LogManager.getLogger(LogManager.java:426) 在(我们的日志接口类,它本质上只是返回 Apache 日志管理器传递的日志) at(全局变量定义文件,第一种使用getLogger的方法) at(我们软件的主要方法,加载全局变量的地方) 引起:java.lang.NoSuchMethodError: javax.mail.Session.setProtocolForAddress(Ljava/lang/String;Ljava/lang/String;)V 在 org.apache.logging.log4j.core.net.SmtpManager$SMTPManagerFactory.createManager(SmtpManager.java:325) 在 org.apache.logging.log4j.core.net.SmtpManager$SMTPManagerFactory.createManager(SmtpManager.java:299) 在 org.apache.logging.log4j.core.appender.AbstractManager.getManager(AbstractManager.java:71) 在 org.apache.logging.log4j.core.net.SmtpManager.getSMTPManager(SmtpManager.java:124) 在 org.apache.logging.log4j.core.appender.SmtpAppender.createAppender(SmtpAppender.java:142) ... 21 更多

2015-05-19 19:08:18,814 错误为附加程序中的 SMTP 返回空对象。 2015-05-19 19:08:18,819 错误无法找到用于记录器致命错误的附加程序邮件程序

配置的细节是正确的(我知道它是一个有效的 IP 等)——它们在 log4j 1 中工作。错误日志几乎没有告诉我有关错误的任何信息,所以我希望有人以前听说过这个。谢谢大家!

【问题讨论】:

  • 你需要把${hostName}改成${sys:hostName}
  • 很好,但这实际上不是我们的问题。这是该软件使用的邮件 API 多年未更新。

标签: java email logging log4j2 smtpappender


【解决方案1】:

这是堆栈跟踪中的重要行:

原因:java.lang.NoSuchMethodError: javax.mail.Session.setProtocolForAddress(Ljava/lang/String;Ljava/lang/String;)V

setProtocolForAddress method 自 1.4 版以来一直是 JavaMail 的一部分,因此这表明您使用的是该 JAR 的旧版本。如果是,请尝试升级到更高版本。

【讨论】:

  • 确实是这样,谢谢。我想当然地认为我们的软件中有一个邮件功能,从没想过检查库上次更新的时间(提示:不是)
【解决方案2】:

请注意,log4j2 有很多查找,而不仅仅是系统属性。因此,您需要将${hostName} 转换为${sys:hostName},如果您正在使用IP 地址查找,这可能是问题的原因。 (尝试对所有查找值进行硬编码以排除这种可能性。)

【讨论】:

  • 它实际上是一个过时的 JavaMail 版本,但还是感谢您的建议!
猜你喜欢
  • 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
相关资源
最近更新 更多