我已经为我的客户安装了一些应用程序,并且我配置了smtp appender以接收错误电子邮件。
不幸的是,我需要一种方法来了解哪个客户正在收到电子邮件。
我试图在地图中设置参数,以便将其显示为电子邮件的主题。我只能在我的应用程序启动并且数据库启动后才能设置此参数:
String[] parametri = {username};
MapLookup.setMainArguments(parametri);
我的log4j2.xml是:
<SMTP name="Mailer" subject="${sys:logPath} - ${map:0}" to="${receipients}"
from="${from}" smtpHost="${smtpHost}" smtpPort="${smtpPort}"
smtpProtocol="${smtpProtocol}" smtpUsername="${smtpUser}"
smtpPassword="${smtpPassword}" smtpDebug="false" bufferSize="200"
ignoreExceptions="false">
</SMTP>
主题是相关部分。不幸的是,主题没有被log4j取代并保持不变。
我做错了什么?
由于
答案 0 :(得分:1)
目前,SmtpAppender类(实际上是它的帮助器SmtpManager)创建一次MimeMessage对象,并将其重用于要发送的所有消息。邮件主题仅初始化一次。在您的配置被读取时,查找只进行一次。
我建议您针对您的用例在Log4j2 Jira问题跟踪器上提出功能请求。
答案 1 :(得分:-1)
注意:log4j 2.6+原生支持此功能;你需要Java7 +。
我为log4j2和Java6创建了一个免费的可用解决方案,其中 ExtendedSmtpAppender
支持主题中的PatternLayout。
如果您仍然使用log4j 1.x(原始问题),只需将您的log4j-1.x.jar
替换为log4j-1.2-api-2.x.jar
- 当然log4j-core-2.x.jar
+ log4j-api-2.x.jar
。
你从Maven Central获得de.it-tw:log4j2-extras
(这需要Java 7+和log4j 2.8+)。
如果您被限制为Java 6(因此log4j 2.3),则使用de.it-tw:log4j2-Java6-extras
另请参阅GitLab项目:https://gitlab.com/thiesw/log4j2-extras(或https://gitlab.com/thiesw/log4j2-Java6-extras)
此外,它支持突发总结,因此您不会在几秒钟或几分钟内收到1000封错误电子邮件。使用案例:通过电子邮件将所有ERROR日志发送给支持/开发人员。在破碎的网络或数据库上,这可能会导致数百个相同的错误电子邮件。
这个appender执行以下操作:
示例配置(内部&lt; Appenders&gt;):
<SMTPx name="ErrorMail" smtpHost="mailer.xxxx.de" smtpPort="25"
from="your name <noReply@xxx.de>" to="${errorEmailAddresses}"
subject="[PROJECT-ID, ${hostName}, ${web:contextPath}] %p: %c{1} - %m%notEmpty{ =>%ex{short})}"
subjectWithLayout="true" bufferSize="5"
burstSummarizingSeconds="300" bsCountInSubject="S" bsMessageMaskDigits="true"
bsExceptionOrigin="true" >
<PatternLayout pattern="-- %d %p %c [%.20t,%x] %m%n" charset="UTF-8" /> <!-- SMTP uses fixed charset for message -->
</SMTPx>
<Async name="AsyncErrorMail" blocking="false" errorRef="Console">
<AppenderRef ref="ErrorMail"/>
</Async>