如何通过 Wildfly 通过电子邮件发送错误日志?

如何通过 Wildfly 通过电子邮件发送错误日志?

令人困惑的是,没有SMTP 实现开箱即用。这怎么就不是基本功能了呢?

尝试添加自定义处理程序类型邮件处理器,但我无法设置属性。似乎其中很大一部分(例如邮件服务器的主机名)是PropertiesMailHandler 的构造函数,但我不知道如何在自定义处理程序的属性中进行设置,因为它依赖于 setter。

还尝试注册 log4j SMTPAppender。尽管这种方法效果出奇地好,而且文档声称这是合法的,但 Wildfly 却威胁要反咬一口:

16:49:21,090 WARN  [org.jboss.as.logging] (management-handler-thread - 3) WFLYLOG0099: Usage of a log4j appender (org.apache.log4j.net.SMTPAppender) found in a custom-handler. Support for using appenders as custom handlers has been deprecated and will be removed in a future release.

我是不是天真地认为,不用编写自己的通用邮件处理程序或将邮件内容推迟到系统日志,我就能实现这一目标?

答案1

您必须开发自己的MailHandlerSmtpHandler。WildFly 目前不提供,因为没有很好的方法来配置它。此外,正如问题评论中所述,它并不是真正理想的错误通知方式。

log4jSmtpAppender将一直有效,直到 WildFly 27 删除对 log4j 的支持为止。

JULMailHandler无法工作,因为 WildFly 需要能够使用 setter 来设置属性。

答案2

我是不是天真地认为,不用编写自己的通用邮件处理程序或将邮件内容推迟到系统日志,我就能实现这一目标?

如果您至少使用 JavaMail 1.5.0、JakartaMail 或 AngusMail,则 MailHandler 本身将连接到端口 25 上的本地地址名称作为user.name系统属性,并在未指定任何属性时计算出发件人和收件人地址。如果正在运行的邮件传输代理接受连接,则可以在 MTA 上配置规则以进行转发和身份验证。保护该 MTA 是此方法的棘手部分。

令人困惑的是,没有现成的 SMTP 实现。这怎么就不是基本功能了呢?

我创建了一个 Angus Mail 问题#110 WildFly 支持 MailHandler在 Angus Mail 2.0.3 或更新版本中提供开箱即用的支持。此更改添加了通过字符串配置邮件属性的新方法。设置步骤如下:

  1. 确定 MailHandler 的模块名称。首先验证 WildFly 中的 Angus Mail 版本。jar 位于wildfly-29.0.1.Final/modules/system/layers/base/org/eclipse/angus/mail/main。如果该版本是 angus-mail-2.0.3.jar 或更新版本,则模块名称为org.eclipse.angus.mail,您可以使用此名称继续执行步骤 2。如果版本较旧,则必须创建一个新模块。下载最新的 jakarta.mail-api、jakarta.activation-api、angus-activation 和 angus-mail jar。启动 WildFly 并连接 jbosscli。使用下载的 4 个 jar 创建一个名为 的模块,org.eclipse.angus.logging-mailhandler该模块将在以下步骤中使用。以下是示例:
module add --name=org.eclipse.angus.logging-mailhandler --resource-delimiter=; --resources=~/jaf-api/api/target/jakarta.activation-api-X.Y.Z.jar;~/mail/api/target/jakarta.mail-api-X.Y.Z.jar;~/angus-activation/activation-registry/target/angus-activation-X.Y.Z.jar;~/angus-mail/providers/angus-mail/target/angus-mail-X.Y.Z.jar --dependencies=jakarta.activation.api,jakarta.mail.api,org.eclipse.angus.activation,org.eclipse.angus.mail,org.jboss.modules,java.logging,org.jboss.logging
  1. 创建垃圾邮件和推送过滤器以避免泛滥。Angus Mail 附带持续时间过滤器可以安装该模块来控制生成电子邮件的最大速率。假设默认 MailHandler 容量为 1000,每小时最多生成一封电子邮件,则在 jbosscli 中使用以下命令(如果需要,编辑模块名称):
/subsystem=logging/filter=SPAM_FILTER:add(module=org.eclipse.angus.logging-mailhandler, class=org.eclipse.angus.mail.util.logging.DurationFilter, properties={records=1000,durationMillis=3600000})

/subsystem=logging/filter=PUSH_FILTER:add(module=org.eclipse.angus.logging-mailhandler, class=org.eclipse.angus.mail.util.logging.DurationFilter, properties={records=1,durationMillis=3600000})
  1. 创造邮件处理器作为 CustomHandler。在 jbosscli 中(如果需要,编辑模块名称):
/subsystem=logging/custom-handler="MAIL":add(class="org.eclipse.angus.mail.util.logging.MailHandler", module="org.eclipse.angus.logging-mailhandler", level="WARNING", formatter="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n", encoding="UTF-8", filter-spec="SPAM_FILTER", properties={"pushLevel"=>"ALL","pushFilter"=>"PUSH_FILTER", "mailEntries"=>"mail.smtp.port:25#!mail.host:localhost#!mail.from:wildfly@localhost#!mail.to:support@localhost#!mail.smtp.connectiontimeout:15000#!mail.smtp.timeout:45000#!verify:local"})

咨询AngusMail API接收额外的邮件条目。当超过 PUSH_FILTER 速率时,此配置将缓冲记录;当超过 SPAM_FILTER 速率时,此配置将删除记录。

  1. 可选地,将 MailHandler 包装在 AsyncHandler 中。在 jbosscli 中(如果需要,编辑模块名称):
/subsystem=logging/async-handler="ASYNC_MAIL":add(level="WARNING", queue-length="10000", overflow-action="DISCARD", subhandlers=[MAIL])

BLOCK如果 WildFly 版本修复了以下问题,则可以采取溢出操作WFCORE-6596:AsyncHandler 不得停放工作线程默认情况下,AsyncHandler 将自动冲洗这可以绕过推送过滤器的冷却时间,从而产生更多更小的电子邮件。

  1. 将 MailHandler 附加到根记录器。在 jbosscli 中(如果需要,编辑模块名称):
/subsystem=logging/root-logger=ROOT:add-handler(name="ASYNC_MAIL")

附加功能或错误可以提交至安格斯邮件问题追踪器

另一个选项是 MailHandler 支持获得环境邮件属性。您可以扩展 MailHandler 并添加 WildFly 所需的属性方法。

public class WildFlyMailHandler extends MailHandler {
     public WildFlyMailHandler() {
     }

     public void setHost(String host) {
         setMailValue("mail.host", host);
     }

     public void setTo(String to) {
         setMailValue("mail.to", to);
     }

     private void setMailValue(String key, String value) {
         Properties p = getMailProperties();
         p.setProperty(key, value);
         setMailProperties(p);
     }
}

然后将该 jar 作为模块安装在 WildFly 中。

相关内容