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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值