我们的应用程序作为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确定我们部署的上下文的名称,但我们尚未确定如何在运行时以编程方式动态地在电子邮件主题中引入此值。
这将大大减少研究错误所需的时间。有什么提示吗?
到目前为止,我们已经考虑过以下几点:
TIA !!
Piko的
答案 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,这只是几行代码。