logback发送错误邮件

  |   0 评论   |   567 浏览

有时候我们需要知道我们的服务器有没有报错,你可以使用一些日志监控的系统,但是这些系统相对来说都比较庞大,还需要安装部署等等。这里给大家介绍一个相对简单点的,不需要单独部署的方法,那就是使用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发送邮件的功能完成了。

本文为博主原创文章,未经博主允许不得转载。

评论

发表评论