来自Map的Log4j2自定义电子邮件主题

时间:2015-04-03 16:16:13

标签: java logging configuration log4j log4j2

我已经为我的客户安装了一些应用程序,并且我配置了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取代并保持不变。

我做错了什么?

由于

2 个答案:

答案 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执行以下操作:

  • 第一次出现是立即通过电子邮件发送
  • 所有以下类似的ERROR日志都被缓冲一段时间(相似性和时间是可配置的)
  • 经过一段时间后,会发送一份摘要电子邮件,其中包含摘要信息(事件数量,时间)以及第一个和最后一个事件

示例配置(内部&lt; Appenders&gt;):

<SMTPx name="ErrorMail" smtpHost="mailer.xxxx.de" smtpPort="25"
        from="your name &lt;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>

另见https://issues.apache.org/jira/browse/LOG4J2-1192