如何在log4j2中的SmtpAppender中设置自定义主题

时间:2017-11-07 22:14:06

标签: java tomcat servlets log4j2 smtpappender

我们的应用程序作为servlet war部署到多个客户环境下的多个tomcat服务器:

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

我们使用log4j2作为我们的日志记录和警报电子邮件机制。到目前为止,一切都很好,我们的致命错误正在发送。但是,当我们部署到新的上下文时,哪个客户产生错误变得越来越清晰。

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

def year_range_average(a, b):
    return a + (b - (a % 100) + 100) % 100 // 2

>>> year_range_average(1858, 60)
1859
>>> year_range_average(1858, 61)
1859
>>> year_range_average(1858, 62)
1860
>>> year_range_average(1898, 2)
1900

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

这将大大减少研究错误所需的时间。有什么提示吗?

到目前为止,我们已经考虑过以下几点:

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

    Piko的

1 个答案:

答案 0 :(得分:2)

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

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

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

更新:查看该票中的旧评论:

  

看起来主题已经支持$$运行时查找。下列   属性用于发送的每封电子邮件,应该是   可以支持这些属性的运行时查找:   *来自   * 回复   * 至   * cc   *密送   * subject(已经是运行时查找)

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

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

然后将系统属性email.subject设置为其他主题,并发送包含不同主题的电子邮件。你能试试吗?

更新2:

如果系统属性不合适,您还可以create a custom lookup,这只是几行代码。