我正在使用slf4j和logback来登录我的java Web应用程序。我需要通过电子邮件发送特定类(以下示例中的MyClass)的信息日志。我在logback中配置了一个电子邮件appender。其余部分可以放在根记录器设置的任何位置。但是我的当前设置不会发送电子邮件。见下文......
设置:
以下是有关jar版本及其他设置的相关信息:
类路径中的jar:
activation-1.1.jar
jcl-over-slf4j-1.7.25.jar
logback-classic-1.2.3.jar
logback-core-1.2.3.jar
logback-ext-spring-0.1.4.jar
logstash-logback-encoder-4.11.jar
mail-1.4.jar
slf4j-api-1.7.25.jar
来自classpath的logback.xml:
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d [%thread] %-5level %logger{5}:%L - %msg%n</pattern>
</encoder>
</appender>
<appender name="email" class="ch.qos.logback.classic.net.SMTPAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<smtpHost>smtp.server</smtpHost>
<to>code4kix@email.com</to>
<from>do-not-reply@email.com</from>
<subject>code4kix - ${HOSTNAME}: %logger{20} - %m</subject>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d [%thread] %-5level %logger{5}:%L - %msg%n</pattern>
</layout>
<!-- <STARTTLS>true</STARTTLS> -->
<!-- <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker"> -->
<!-- <bufferSize>1</bufferSize> -->
<!-- </cyclicBufferTracker> -->
<!-- <asynchronousSending>false</asynchronousSending> -->
</appender>
<root level="error">
<appender-ref ref="console" />
</root>
<logger name="mypackage.MyClass" level="info" additivity="true">
<appender-ref ref="email"/>
</logger>
问题:
如果我在MyClass.java中有logger.error语句,那么电子邮件似乎没有问题,但是如果他们只有logger.info,那么电子邮件不会消失......尽管将阈值配置为{{1} }!
info
我确实在控制台日志中得到了这个,但电子邮件永远不会消失。什么可能是错的?
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyClass
{
private static Logger logger = LoggerFactory.getLogger(MyClass.class);
public void myMethod()
{
logger.error("using this sends the email out");
logger.info("using this doesn't");
}
}
答案 0 :(得分:2)
从我最近阅读的logback看起来好像只有在ERROR下才会发送一封电子邮件。 Chapter 4: Appenders
答案 1 :(得分:0)
感谢Elijah让我指向正确的方向。正如SMTP Appender中的文档中所述:
默认情况下,电子邮件传输由日志记录事件触发 等级错误
有多种方法可以解决这个问题。对我来说最简单的方法是实现我自己的EventEvaluator
,并在smtp appender配置中使用它(如下所示)。或者,您可以使用标记来探索解决此问题。
public class OnInfoEvaluator extends EventEvaluatorBase<ILoggingEvent> {
@Override
public boolean evaluate(ILoggingEvent loggingEvent) throws NullPointerException, EvaluationException {
if(loggingEvent.getLevel().toInt() >= Level.INFO_INT)
{
return true;
}
else
{
return false;
}
}
}
在配置中:
<appender name="email" class="ch.qos.logback.classic.net.SMTPAppender">
<evaluator class="mypackage.OnInfoEvaluator" />
...
</appender>