logback之邮件告警通知SMTPAppender

Posted 一个懒惰的程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了logback之邮件告警通知SMTPAppender相关的知识,希望对你有一定的参考价值。

上文简单的,应该能满足我们日常业务日志打印的80%的需求了,可是对于某些比较重要的业务,可能对于异常需要实时的做出响应,那该怎么办呢?


1,logback的异常邮件告警发送


配置文件如下:


<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">

    <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <smtpHost>smtp.xxx.com</smtpHost>
        <smtpPort>465</smtpPort>
        <from>xxx@qq.com</from>
        <username>xxx@qq.com</username>
        <password>123456</password>
        <!-- 邮件接收者 多个接收者逗号分隔 -->
        <to>b@qq.com</to>
        <!-- 邮件主题 -->
        <subject>TESTING: %logger{20} - %m</subject>
        <!-- 是否异步发送 -->
        <asynchronousSending>true</asynchronousSending>
        <!-- 默认值是false 启用异步发送的话需要设置为true -->
        <includeCallerData>true</includeCallerData>
        <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%date [%thread] [%level] [%logger:%line] - %msg%n</pattern>
        </layout>       
    </appender>

    <root level="DEBUG">
        <appender-ref ref="EMAIL" />
      </root>

</configuration>


测试类如下:


/**
 * 日志以邮件方式发送
 * 
 * @author zhangqh
 * @date 2018年8月2日
 */

public class DemoLogReadConfig08 {

    public static void main(String[] args) throws InterruptedException {

        // 设置系统变量logback.configurationFile值  logback会读取该系统配置 后边源码解析会具体讲到这一块
        System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY, "config/logback08.xml");
        Logger logger = LoggerFactory.getLogger(DemoLogReadConfig08.class);
        logger.error("我是异常邮件告警.......");

    }
}


查看邮件结果如下图:



突然有一天你发现收到的告警特别多,那如何控制异常日志邮件阈值呢


2,自定义logback日志异常邮件阈值


新增一个阈值控制类CounterBasedEvaluator实现EventEvaluator如下:


package com.zhiliao.demo;

import ch.qos.logback.core.boolex.EvaluationException;
import ch.qos.logback.core.boolex.EventEvaluator;
import ch.qos.logback.core.spi.ContextAwareBase;

public class CounterBasedEvaluator extends ContextAwareBase implements
        EventEvaluator<Object
{
    /**
     * 日志阈值控制
     */

    static int LIMIT = 3;
    int counter = 0;
    String name;

    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 void start() {
        // TODO Auto-generated method stub

    }

    @Override
    public void stop() {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean isStarted() {
        // TODO Auto-generated method stub
        return false;
    }

}


配置修改为如下:


<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">

    <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <smtpHost>smtp.xxx.com</smtpHost>
        <smtpPort>465</smtpPort>
        <from>xxx@qq.com</from>
        <username>xxx@qq.com</username>
        <password>123456</password>
        <!-- 邮件接收者 多个接收者逗号分隔 -->
        <to>b@qq.com</to>
        <!-- 邮件主题 -->
        <subject>TESTING: %logger{20} - %m</subject>
        <!-- 是否异步发送 -->
        <asynchronousSending>true</asynchronousSending>
        <!-- 默认值是false 启用异步发送的话需要设置为true -->
        <includeCallerData>true</includeCallerData>
        <!-- 超过多少次发送邮件 -->
       <evaluator class="com.zhiliao.demo.CounterBasedEvaluator"></evaluator>
        <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%date [%thread] [%level] [%logger:%line] - %msg%n</pattern>
        </layout>       
    </appender>

    <root level="DEBUG">
        <appender-ref ref="EMAIL" />
      </root>

</configuration>


测试类修改如下:


/**
 * 日志以邮件方式发送
 * 
 * @author zhangqh
 * @date 2018年8月2日
 */

public class DemoLogReadConfig08 {

    public static void main(String[] args) throws InterruptedException {

        // 设置系统变量logback.configurationFile值  logback会读取该系统配置 后边源码解析会具体讲到这一块
        System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY, "config/logback08.xml");
        Logger logger = LoggerFactory.getLogger(DemoLogReadConfig08.class);
        logger.error("我是异常邮件告警1.......");
        logger.error("我是异常邮件告警2.......");
        logger.error("我是异常邮件告警3.......");
        logger.error("我是异常邮件告警4.......");

    }
}


执行结果将会发现只收到一条告警邮件如下:


logback之邮件告警通知SMTPAppender


3,logback基于标记发送邮件告警


配置修改如下:


<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">

    <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <smtpHost>smtp.xxx.com</smtpHost>
        <smtpPort>465</smtpPort>
        <from>xxx@qq.com</from>
        <username>xxx@qq.com</username>
        <password>123456</password>
        <!-- 邮件接收者 多个接收者逗号分隔 -->
        <to>b@qq.com</to>
        <!-- 邮件主题 -->
        <subject>TESTING: %logger{20} - %m</subject>
        <!-- 是否异步发送 -->
        <asynchronousSending>true</asynchronousSending>
        <!-- 默认值是false 启用异步发送的话需要设置为true -->
        <includeCallerData>true</includeCallerData>
         <!-- 超过多少次发送邮件 -->
       <!-- 超过多少次发送邮件 -->
<!--         <evaluator class="com.zhiliao.demo.CounterBasedEvaluator"></evaluator> -->

<!--         基于标记发送邮件 -->
        <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
          <marker>NOTIFY_ADMIN</marker>
<!--           you specify add as many markers as you want -->
          <marker>TRANSACTION_FAILURE</marker>
        </evaluator>
        <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%date [%thread] [%level] [%logger:%line] - %msg%n</pattern>
        </layout>       
    </appender>

    <root level="DEBUG">
        <appender-ref ref="EMAIL" />
      </root>

</configuration>


测试类如下:


package com.zhiliao.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;

import ch.qos.logback.classic.util.ContextInitializer;

/**
 * 日志以邮件方式发送
 * 
 * @author zhangqh
 * @date 2018年8月2日
 */

public class DemoLogReadConfig08 {

    public static void main(String[] args) throws InterruptedException {

        // 设置系统变量logback.configurationFile值  logback会读取该系统配置 后边源码解析会具体讲到这一块
        System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY, "config/logback08.xml");
        Logger logger = LoggerFactory.getLogger(DemoLogReadConfig08.class);
        Marker notifyAdmin = MarkerFactory.getMarker("NOTIFY_ADMIN");
        for(int i=0;i<2;i++){
            logger.error("基于标记告警的开始......{}",i);
            logger.error(notifyAdmin,"基于标记告警的开始结束.........{}",i);
            Thread.sleep(1000);
        }

        logger.error("我是不会发告警的error.......");

    }
}


运行结果将会收到两封告警邮件如下:


logback之邮件告警通知SMTPAppender



好了今天关于logback邮件告警的使用就到此了,更多logback高级功能敬请期待..........



以上是关于logback之邮件告警通知SMTPAppender的主要内容,如果未能解决你的问题,请参考以下文章

Zabbix自定义SMS邮件告警通知

架构实战篇(十三):Spring Boot Logback 邮件通知

Zabbix实现电话邮件微信告警通知的实践分享

Zabbix4配置邮件告警通知

Prometheus配置alertmanager告警邮件通知

运维道中道之“Shell脚本日志关键字监控+告警”