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.......");
}
}
执行结果将会发现只收到一条告警邮件如下:
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邮件告警的使用就到此了,更多logback高级功能敬请期待..........
以上是关于logback之邮件告警通知SMTPAppender的主要内容,如果未能解决你的问题,请参考以下文章
架构实战篇(十三):Spring Boot Logback 邮件通知