我使用的是logback 1.2.3版。我在我的logback xml配置文件中配置了一个SMTPAppender
,如下所示:
<appender name="email" class="ch.qos.logback.classic.net.SMTPAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>warn</level>
</filter>
<smtpHost>smtp.mydomain.org</smtpHost>
<to>[email protected]</to>
<from>[email protected]</from>
<subject>${HOSTNAME} | %-5level: %logger{20}</subject>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d [%thread] %-5level %logger{5}:%L - %msg%n</pattern>
</layout>
<asynchronousSending>false</asynchronousSending>
</appender>
如果我有一个类似下面的Java类,它会向我发送两封单独的电子邮件。我需要他们在一封电子邮件中。怎么样?
logger.error("statement 1");
logger.error("statement 2");
请注意,将以下内容添加到logback配置中没有帮助。我错过了什么?
<STARTTLS>true</STARTTLS>
<cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
<bufferSize>10</bufferSize>
</cyclicBufferTracker>
<asynchronousSending>false</asynchronousSending>
我忘了更新答案。我很快就意识到从logback的角度来看并不是那么直截了当。如何知道何时触发电子邮件?如果在这之后还有另一个logger.error("statement 3");
,然后电子邮件应该出去怎么办:
logger.error("statement 1");
logger.error("statement 2");
我们需要明确告诉logback何时触发电子邮件。阅读更多关于标记的here。
因此,您需要在结尾处使用类似记录器语句的内容来标记电子邮件触发时:
logger.info(SMTP_TRIGGER, "statement last");
而且,您需要将您的logback配置更新为:
<appender name="SMTP" class="ch.qos.logback.classic.net.SMTPAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>warn</level>
</filter>
<smtpHost>smtp.mydomain.org</smtpHost>
<to>[email protected]</to>
<from>[email protected]</from>
<subject>${HOSTNAME} | %-5level: %logger{20}</subject>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d [%thread] %-5level %logger{5}:%L - %msg%n</pattern>
</layout>
<asynchronousSending>false</asynchronousSending>
<evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
<expression>
marker != null && marker.contains("SMTP_TRIGGER")
</expression>
</evaluator>
</appender>