SpringBoot实战基于异常日志的邮件报警
文章图片
SpringBoot实战基于异常日志的邮件报警相信所有奋斗在一线的小伙伴,会很关心自己的系统的运行情况,一般来说,基础设施齐全一点的公司都会有完善的报警方案,那么如果我们是一个小公司呢,不能因为基础设施没有,就失去对象的感知能力吧;如果我们的系统大量异常却不能实时的触达给我们,那么也就只会有一个结果--杀个程序猿祭天
本文简单的介绍一种实现思路,基于error日志来实现邮件的报警方案
I. 项目环境 1. 项目依赖
本项目借助
SpringBoot 2.2.1.RELEASE
+ maven 3.5.3
+ IDEA
进行开发开一个web服务用于测试
org.springframework.boot
spring-boot-starter-mail
2. 配置
邮件相关配置如下,注意使用自己的用户名 + 授权码填充下面缺失的配置
spring:
#邮箱配置
mail:
host: smtp.163.com
from: xhhuiblog@163.com
# 使用自己的发送方用户名 + 授权码填充
username:
password:
default-encoding: UTF-8
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
II. 异常日志的邮件预警 1. 设计思路
接下来这个方案的主要出发点在于,当程序出现大量的异常,表明应用多半出现了问题,需要立马发送给项目owner
要实现这个方案,关键点就在于异常出现的感知与上报
- 异常的捕获,并输出日志(这个感觉属于标配了吧,别告诉我现在还有应用不输出日志文件的...)
- 对于这个感知,借助logback的扩展机制,可以实现,后面介绍
- 异常上报:邮件发送
2. 自定义appender
定义一个用于错误发送的Appender,如下
public class MailUtil extends AppenderBase {public static void sendMail(String title, String context) {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
//邮件发送人
simpleMailMessage.setFrom(ContextUtil.getEnvironment().getProperty("spring.mail.from", "bangzewu@126.com"));
//邮件接收人,可以是多个
simpleMailMessage.setTo("bangzewu@126.com");
//邮件主题
simpleMailMessage.setSubject(title);
//邮件内容
simpleMailMessage.setText(context);
JavaMailSender javaMailSender = ContextUtil.getApplicationContext().getBean(JavaMailSender.class);
javaMailSender.send(simpleMailMessage);
}private static final long INTERVAL = 10 * 1000 * 60;
private long lastAlarmTime = 0;
@Override
protected void append(ILoggingEvent iLoggingEvent) {
if (canAlarm()) {
sendMail(iLoggingEvent.getLoggerName(), iLoggingEvent.getFormattedMessage());
}
}private boolean canAlarm() {
// 做一个简单的频率过滤
long now = System.currentTimeMillis();
if (now - lastAlarmTime >= INTERVAL) {
lastAlarmTime = now;
return true;
} else {
return false;
}
}
}
3. Spring容器
上面的邮件发送中,需要使用
JavaMailSender
,写一个简单的SpringContext工具类,用于获取Bean/Propertiy@Component
public class ContextUtil implements ApplicationContextAware, EnvironmentAware {private static ApplicationContext applicationContext;
private static Environment environment;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ContextUtil.applicationContext = applicationContext;
}@Override
public void setEnvironment(Environment environment) {
ContextUtil.environment = environment;
}public static ApplicationContext getApplicationContext() {
return applicationContext;
}public static Environment getEnvironment() {
return environment;
}
}
4. logback配置
接下来就是在日志配置中,使用我们上面定义的Appender
logback-spring.xml
文件内容如下:
%d [%t] %-5level %logger{36}.%M\(%file:%line\) - %msg%nUTF-8
ERROR
5. 测试demo
接下来演示一下,是否可以达到我们的预期
@Slf4j
@RestController
@SpringBootApplication
public class Application {public static void main(String[] args) {
SpringApplication.run(Application.class);
}@GetMapping("div")
public String div(int a, int b) {
try {
return String.valueOf(a / b);
} catch (Exception e) {
log.error("div error! {}/{}", a, b, e);
return "some error!";
}
}
}
文章图片
5.小结
【SpringBoot实战基于异常日志的邮件报警】本篇博文主要提供了一个思路,借助logback的扩展机制,来实现错误日志与预警邮件绑定,实现一个简单的应用异常监控
上面这个实现只算是一个雏形,算是抛砖引玉,有更多可以丰富的细节,比如
- 飞书/钉钉通知(借助飞书钉钉的机器来报警,相比较于邮件感知性更高)
- 根据异常类型,做预警的区分
- 更高级的频率限制等
- 一个可扩展的报警系统 https://github.com/liuyueyi/quick-alarm
- 工程:https://github.com/liuyueyi/spring-boot-demo
- 源码:https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-case/430-mail-alarm
- SpringBoot 系列之邮件发送姿势介绍
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
- 一灰灰Blog个人博客 https://blog.hhui.top
- 一灰灰Blog-Spring专题博客 http://spring.hhui.top
文章图片
推荐阅读
- Activiti(一)SpringBoot2集成Activiti6
- 基于微信小程序带后端ssm接口小区物业管理平台设计
- 基于|基于 antd 风格的 element-table + pagination 的二次封装
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- 基于爱,才会有“愿望”当“要求”。2017.8.12
- 《机器学习实战》高清中文版PDF英文版PDF+源代码下载
- --木木--|--木木-- 第二课作业#翼丰会(每日一淘6+1实战裂变被动引流# 6+1模式)
- springboot使用redis缓存
- 2020-07-29《吴军·阅读与写作50讲》24实战才能转化效能