1. SMTPAppender在固定大小的缓冲里积累记录事件, 当用户指定的事件发生后, 就通过email发出这些事件。默认情况下, email发送是由级别为ERROR或更高级别的记录事件触发的。
2. SMTPAppender的属性如下
3. SMTPAppender依赖JavaMail API, 在JavaMail API 1.4版下通过测试(高版本的JavaMail暂时不支持)。
4. 事件的触发
4.1. 如果未指定选项"Evaluator", 则SMTPAppender被默认分配一个OnErrorEveluator(ch.qos.logback.classic.boolex.OnErrorEvaluator)实例, 当遇到级别为ERROR或更高级别的事件后, 触发email传输。虽然遇到错误就触发email传输很合理, 但也可以通过提供EventEvaluator接口的不同实现来覆盖此默认行为。
4.2. OnErrorEveluator类的实现
4.3. SMTPAppender对每个进来的事件都调用evaluate()方法进行评估, 为的是检查事件是应该触发email传输还是放入循环缓冲。评估结果为true时, 就发送email。SMTPAppender包含且仅包含一个求值器(evaluator)对象, 该对象可以管理自己的内部状态。
4.4. SMTPAppender继承自SMTPAppenderBase, SMTPAppenderBase是发送邮件的基础类, 里面提供了诸多发送邮件时需要的字段, 同时评估evaluate()方法也是在该类的append(E eventObject)方法里调用的。
4.5. EventEvaluator接口的核心方法就是evaluate(E event)评估方法
4.6. EventEvaluator接口的实现
5. 例子
5.1. 新建一个名为SMTPAppender的Java项目, 同时添加相关jar包
5.2. 在src目录下编辑logback.xml
<configuration debug="true">
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="mail" class="ch.qos.logback.classic.net.SMTPAppender">
<from>xxxxxx@qq.com</from>
<to>oooooo@qq.com</to>
<subject>测试日志</subject>
<smtpHost>smtp.qq.com</smtpHost>
<username>xxxxxx@qq.com</username>
<password>drnhgdgad</password>
<layout class="ch.qos.logback.classic.html.HTMLLayout" />
<evaluator class="com.zr.mail.MyEvaluator" />
</appender>
<root level="debug">
<appender-ref ref="mail" />
<appender-ref ref="stdout" />
</root>
</configuration>
5.3. 自定义一个MyEvaluator.java的评估类
package com.zr.mail;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.boolex.EvaluationException;
import ch.qos.logback.core.boolex.EventEvaluatorBase;
/**
* 自定义评估类
* 项目有一条错误日志就发送邮件似乎有一点频繁, 我们这里自定义一个简单的评估类, 有5条及其以上上错误日志再发送邮件。
*/
public class MyEvaluator extends EventEvaluatorBase<ILoggingEvent> {
private int errorCount = 5;
private int count;
@Override
public boolean evaluate(ILoggingEvent event) throws NullPointerException, EvaluationException {
if(event.getLevel().levelInt >= Level.ERROR_INT) {
count++;
}
if(count >= errorCount) {
count = 0;
return true;
}
return false;
}
}
5.4. 编辑MyMail.java
package com.zr.mail;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyMail {
private static final Logger logger = LoggerFactory.getLogger(MyMail.class);
public static void main(String[] args) {
for(int i = 0; i < 10; i++) {
logger.trace("我是一个跟踪信息");
logger.debug("我是一个测试信息");
logger.info("我是一个日志信息");
logger.warn("我是一个警告信息");
logger.error("我是一个错误信息");
// 停一会再退出程序, 不然邮件发不出去
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
5.5. 运行项目
6. 基于标记的触发
6.1. 根据ERROR级别触发email可能会导致产生太多email。Logback提供了另外的触发策略: OnMarkerEvaluator(ch.qos.logback.classic.boolex.OnMarkerEvaluator)。本质上, 只有当
事件包含一个用户指定的标记时, 才会触发email。
6.2. 新建一个名为SMTPOnMarkerEvaluator的Java项目, 同时添加相关jar包
6.3. 在src目录下编辑logback.xml
<configuration>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="mail" class="ch.qos.logback.classic.net.SMTPAppender">
<evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
<!-- 管理员日志或者交易失败发送邮件 -->
<marker>NOTIFY_ADMIN</marker>
<marker>TRANSACTION_FAILURE</marker>
</evaluator>
<smtpHost>smtp.qq.com</smtpHost>
<smtpPort>25</smtpPort>
<username>xxxxxxxxxx@qq.com</username>
<password>drnhvsbzviqgdgad</password>
<to>oooooooooo@qq.com</to>
<from>xxxxxxxxxx@qq.com</from>
<subject>测试日志</subject>
<!-- 这里只有layout没有encoder -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</layout>
</appender>
<root level="debug">
<appender-ref ref="mail" />
<appender-ref ref="stdout" />
</root>
</configuration>
6.5. 运行项目