11_logback中的SMTPAppender

  • 时间:
  • 浏览:
  • 来源:互联网

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">
		<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>

	<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. 运行项目

本文链接http://www.dzjqx.cn/news/show-617538.html