技术派项目源码地址 :
- Gitee :技术派 - https://gitee.com/itwanger/paicoding
- Github :技术派 - https://github.com/itwanger/paicoding
修改启动VM参数
- 但是在本地启动测试时,请注意关闭devtool,它会引发类加载问题
- **启动时添加配置 **
**-Dspring.devtools.restart.enabled=false**
要实现这个方案,关键点就在于异常出现的感知与上报
- 异常的捕获,并输出日志(这个感觉属于标配了吧,别告诉我现在还有应用不输出日志文件的…)
- 对于这个感知,借助logback的扩展机制,可以实现,后面介绍
- 异常上报:邮件发送
自定义Appender
package com.itheima.mp.util;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
/**
* @author YiHui
* @date 2023/3/19
*/
public class AlarmUtil extends AppenderBase<ILoggingEvent> {
private static final long INTERVAL = 10 * 1000 * 60;
private long lastAlarmTime = 0;
@Override
protected void append(ILoggingEvent iLoggingEvent) {
if (canAlarm()) {
EmailUtil.sendMail(iLoggingEvent.getLoggerName(),
SpringUtil.getConfig("alarm.user", "XXXXXXXXXX@qq.com"),
iLoggingEvent.getFormattedMessage());
}
}
private boolean canAlarm() {
// 做一个简单的频率过滤,一分钟内只允许发送一条报警
long now = System.currentTimeMillis();
if (now - lastAlarmTime >= INTERVAL) {
lastAlarmTime = now;
return true;
} else {
return false;
}
}
}
修改配置文件
alarm:
# 接收报警的用户邮箱,多个人时,使用英文逗号分隔
user: xhhuiblog@163.com
logback配置
- 这个
logback-spring.xml
直接放在resources
目录下
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 当出现 error 异常日志时,邮件报警 -->
<appender name="errorAlarm" class="com.itheima.mp.util.AlarmUtil">
<!-- 只记录 ERROR 级别的日志 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<!-- 配置项目包的日志记录级别 -->
<logger name="com.itheima.mp" level="INFO" additivity="false">
<appender-ref ref="console"/>
<appender-ref ref="errorAlarm"/>
</logger>
<!-- 根 logger,确保其他包的日志也输出到控制台 -->
<root level="INFO">
<appender-ref ref="console"/>
</root>
</configuration>
- 修改成自己项目对应的目录
测试
import org.apache.commons.lang3.StringEscapeUtils;
@PostMapping("/alarm")
public String alarm(String content) {
content = StringEscapeUtils.escapeHtml4(content);
log.error("测试异常报警: {}", content);
return "移除日志接收完成!";
}
- 测试结果