有时候我们需要知道我们的服务器有没有报错,你可以使用一些日志监控的系统,但是这些系统相对来说都比较庞大,还需要安装部署等等。这里给大家介绍一个相对简单点的,不需要单独部署的方法,那就是使用logback发送邮件。
首先引入jar包(注意版本号,如果邮件没有发出来,多半是版本号的问题)
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
接着在logback.xml里面添加配置
<appender name="mail" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>smtp.xxxx.com</smtpHost>
<ssl>false</ssl>
<smtpPort>25</smtpPort>
<username>xxxx</username>
<password>xxxxx</password>
<from>xxxx</from>
<to>xxxxxx</to>
<subject>错误邮件</subject>
<layout class="ch.qos.logback.classic.html.HTMLLayout"/>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<root level="INFO">
<appender-ref ref="mail" />
</root>
如果你需要发送多个用户,那么<to>xxxxxx,bbbbbbb</to>,以短号隔开
这里基本的配置就好了,默认是一个错误发一份邮件,想想有点恐怖,你可能会收到很多很多邮件,那有没有办法10个错误发一份邮件呢?或者1分钟内发生10个错误发邮件呢?
答案是可以的,这里你需要自定义发送规则
import ch.qos.logback.core.boolex.EvaluationException;
import ch.qos.logback.core.boolex.EventEvaluator;
import ch.qos.logback.core.spi.ContextAwareBase;
//这个类实现了每10个错误发邮件
@SuppressWarnings("rawtypes")
public class CounterBasedEvaluator extends ContextAwareBase implements EventEvaluator{
private final static int LIMIT = 10;//错误上限次数
private int counter = 0;//错误计数
private String name;//名称
/**
* 是否发送邮件
*
* @param event Object
* @return boolean
* @throws EvaluationException EvaluationException
* @throws NullPointerException NullPointerException
*/
public boolean evaluate(Object event) throws NullPointerException,
EvaluationException {
counter++;
if (counter == LIMIT) {//错误次数等于错误上限次数时,发送邮件
counter = 0;
return true;
} else {//不发送邮件
return false;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean isStarted() {
return false;
}
@Override
public void start() {
}
@Override
public void stop() {
}
}
import ch.qos.logback.core.boolex.EvaluationException;
import ch.qos.logback.core.boolex.EventEvaluator;
import ch.qos.logback.core.spi.ContextAwareBase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 这个类实现每1分钟有10个错误发邮件,和对并发错误的处理
*
*/
@SuppressWarnings("rawtypes")
public class CounterBasedEvaluator extends ContextAwareBase implements EventEvaluator {
private Logger logger = LoggerFactory.getLogger(getClass());
//错误上限次数
private final static int LIMIT = 10;
//错误计数
private static AtomicInteger counter = new AtomicInteger(0);
//名称
private String name;
private Date startDate = null;
/**
* 是否发送邮件
*
* @param event Object
* @return boolean
* @throws EvaluationException EvaluationException
* @throws NullPointerException NullPointerException
*/
@Override
public boolean evaluate(Object event) throws NullPointerException,EvaluationException {
if(startDate == null){
startDate=new Date();
}
long second = DateUtils.getDistanceSecond(startDate,new Date());
logger.info("【logback事件跟踪-evaluate】开始时间:{},相差秒数:{},counter:{}",startDate,second,counter.get());
if(second<=60 && second>=0){
counter.getAndIncrement();
}else{
counter.set(0);
startDate=new Date();
}
//错误次数等于错误上限次数时,发送邮件
if (counter.get() == LIMIT) {
counter.set(0);
startDate=new Date();
return true;
} else {//不发送邮件
return false;
}
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public boolean isStarted() {
return false;
}
@Override
public void start() {
}
@Override
public void stop() {
}
}
这里提供了两个例子,你也可以自己实现发送规则。
最后一步,在<appender name="mail" class="ch.qos.logback.classic.net.SMTPAppender">里面添加
<evaluator class="com.lljz.bill.base.evaluator.CounterBasedEvaluator" />
到这里logback发送邮件的功能完成了。
本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点
注意:本文归作者所有,未经作者允许,不得转载