1

我们的应用程序被部署为多个客户上下文下的多个 tomcat 服务器的 servlet 战争:

customer#application.war

我们使用 log4j2 作为我们的日志记录和警报电子邮件机制。到目前为止,一切正常,我们的致命错误正在发送。然而,当我们部署到新的环境时,越来越不清楚是哪个客户产生了错误。

到目前为止,主题值似乎是静态的,并在配置文件中设置,并且在构建记录器时加载了系统变量:

subject="[${applicationname}] Fatal Error ${hostname}:${sys:pwd}"

虽然似乎有一种方法可以通过 servlet API 确定我们部署的上下文的名称,但我们还没有确定如何在运行时以编程方式和动态地在电子邮件主题中引入这个值。

这将大大减少研究错误所需的时间。有小费吗?

到目前为止,我们已经考虑了以下内容:

  1. 针对每个客户上下文的自定义 log4j2 配置的自定义战争文件(非常hackish)
  2. 更新所有 log.fatal 调用以包含来自 servlet 的上下文信息(可怕)
  3. 自定义 SmtpAppender(最终的和受保护的,所以就出来了)
  4. 自定义 SmtpManager 并覆盖 MimeMessage 对象中的主题(似乎可行但文档未显示如何实现)

蒂亚!!

皮科

4

1 回答 1

2

从 2.9.1 开始,这实际上是 Log4j2 中的一个已知问题。问题是一个 MimeMessage 被缓存并且主题变成了一个固定值。一个简单的解决方案是停止缓存。

有一张公开票可以解决这个问题:Log4j2-1450。(相关:Log4j2-1192,它实现了模式查找,但没有解决 MimeMessage 被缓存的问题。)

如果您可以提供补丁或拉取请求,它将大大增加快速解决此问题的机会。


更新:查看我在那张票中的旧评论:

看起来主题已经支持 $$ 运行时查找。以下属性用于发送的每封电子邮件,并且应该可以支持这些属性的运行时查找: * from * replyto * to * cc * bcc * subject (已经是运行时查找)

应该可以将主题配置为系统属性查找,如下所示:

subject = "$${sys:email.subject}"

然后,您将系统属性设置email.subject为不同的主题并发送具有不同主题的电子邮件。你能试试这个吗?


更新 2:

如果系统属性不合适,还可以创建自定义查找,这只是几行代码。

于 2017-11-07T23:14:26.857 回答