让错误发声:实时监控异常日志并触发报警

技术派项目源码地址 :


修改启动VM参数

  • 但是在本地启动测试时,请注意关闭devtool,它会引发类加载问题
  • **启动时添加配置 ****-Dspring.devtools.restart.enabled=false**

image.png

要实现这个方案,关键点就在于异常出现的感知与上报

  • 异常的捕获,并输出日志(这个感觉属于标配了吧,别告诉我现在还有应用不输出日志文件的…)
  • 对于这个感知,借助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>


  • 修改成自己项目对应的目录

image.png

测试

import org.apache.commons.lang3.StringEscapeUtils;

@PostMapping("/alarm")
public String alarm(String content) {
	content = StringEscapeUtils.escapeHtml4(content);
	log.error("测试异常报警: {}", content);
	return "移除日志接收完成!";
}

  • 测试结果

image.png

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值