Spring Boot项目监控异常,发送邮件

本文介绍了如何在SpringBoot项目中实现程序异常的监控,当异常达到预设次数时,通过异步方式发送邮件通知团队。使用了SLF4J、JavaMailSender和配置文件来管理邮件发送和日志记录。
摘要由CSDN通过智能技术生成

刚刚开通了一个公众号,会分享一些技术博客和自己觉得比较好的项目,同时会更新一些自己使用的工具和图书资料,后面会整理一些面试资料进行分享,觉得有兴趣的可以关注一下。
在这里插入图片描述

Spring Boot项目监控异常,发送邮件


需求

之前博客有提到,就是需要监控程序异常,因为这个是后台运行,无法监控程序异常,所以需要监控应用异常是否出现大面积报错。

应用每天记录报错次数,如果大于预定次数,则发送邮件通知团队处理,发送之后就不需要进行记录了,当天不需要进行通知了,隔天再进行通知。


实现

直接上代码,比较简单,记录一下:

@Service
@Slf4j
@EnableConfigurationProperties(MonitorConfig.class)
public class MonitorExceptionService {

    @Resource
    private JavaMailSender mailSender;

    @Resource
    private MonitorConfig monitorConfig;

    @Value("${spring.profiles.active:test}")
    private String profile;

    private volatile LocalDate lastDate;
    private volatile int errorTimes = 0;
    private volatile boolean mailFlag = false;
    private final Map<String, List<String>> ERROR_STACK = new ConcurrentHashMap<>();

    @Async
    synchronized public void recordError(Exception e) {
        LocalDate now = LocalDate.now(ZoneId.of("Asia/Shanghai"));
        if (Objects.isNull(lastDate) || now.isAfter(lastDate)) {
            lastDate = now;
            errorTimes = 0;
            mailFlag = false;
            ERROR_STACK.clear();
            log.info("clear old data done!");
        }
        if (mailFlag) {
            return;
        }
        errorTimes ++;

        String exceptionName = e.getClass().getName();
        List<String> list = ERROR_STACK.get(exceptionName);
        if (Objects.isNull(list)) {
            list = new ArrayList<>();
            ERROR_STACK.put(exceptionName, list);
        }
        list.add(e.getMessage());

        if (errorTimes >= monitorConfig.getMaxErrorTimes()) {
            try {
                sendEmail();
            } catch (MessagingException ex) {
                log.error("send mail notification error", ex);
            }
        }

    }

    private void sendEmail() throws MessagingException {
        log.info("start send email");
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,true, StandardCharsets.UTF_8.name());
        messageHelper.setFrom(monitorConfig.getMailFrom());
        messageHelper.setTo(monitorConfig.getMailTo());
        messageHelper.setSubject(buildSubject());
        messageHelper.setText(monitorConfig.getMailTemplate());
        messageHelper.addAttachment("error.txt", new ByteArrayDataSource(buildAttachment(), "application/octet-stream"));
        mailSender.send(mimeMessage);
        log.info("end send email");
        mailFlag = true;
    }

    private byte[] buildAttachment() {
        StringBuilder sb = new StringBuilder();
        ERROR_STACK.forEach((err, list) -> {
            sb.append(err).append(": \n");

            for (int i = 0; i < list.size(); i++) {
                sb.append("   ").append(i).append(". ").append(list.get(i)).append("\n");
            }
            sb.append("\n");
        });

        return sb.toString().getBytes(StandardCharsets.UTF_8);
    }

    private String buildSubject() {
        String format = LocalDate.now(ZoneId.of("Asia/Shanghai")).format(DateTimeFormatter.ISO_LOCAL_DATE);

        return String.format("SYSTEM ERROR at %s (%s)",profile, format);
    }
}

程序是异步处理,但是需要上锁,因为是单节点,只需要这一个就够了,双节点问题也不大,就是发送两次而已,也可以换成分布式锁,没有条件的话可以换成数据库的锁即可。

打完收工!

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个使用Spring Boot发送邮件的示例代码: 首先需要在pom.xml文件中添加Spring Boot Mail依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> ``` 然后在application.properties文件中配置邮件服务器相关信息: ```properties # 邮件服务器地址 spring.mail.host=smtp.example.com # 邮件服务器端口号 spring.mail.port=587 # 邮件发送者账号 spring.mail.username=sender@example.com # 邮件发送者密码 spring.mail.password=**************** # 是否开启SSL spring.mail.properties.mail.smtp.ssl.enable=true # 是否开启TLS spring.mail.properties.mail.smtp.starttls.enable=true ``` 接下来创建一个EmailService类: ```java @Service public class EmailService { @Autowired private JavaMailSender mailSender; public void sendSimpleMail(String to, String subject, String content) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(to); message.setSubject(subject); message.setText(content); mailSender.send(message); } public void sendHtmlMail(String to, String subject, String content) throws MessagingException { MimeMessage message = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setTo(to); helper.setSubject(subject); helper.setText(content, true); mailSender.send(message); } } ``` 其中,sendSimpleMail方法用于发送普通文本邮件,sendHtmlMail方法用于发送HTML格式邮件。 最后,可以在Controller中调用EmailService进行邮件发送: ```java @RestController public class EmailController { @Autowired private EmailService emailService; @GetMapping("/sendSimpleMail") public String sendSimpleMail() { String to = "recipient@example.com"; String subject = "测试邮件"; String content = "这是一封测试邮件"; emailService.sendSimpleMail(to, subject, content); return "发送成功"; } @GetMapping("/sendHtmlMail") public String sendHtmlMail() throws MessagingException { String to = "recipient@example.com"; String subject = "测试邮件"; String content = "<html><body><h1>这是一封测试邮件</h1></body></html>"; emailService.sendHtmlMail(to, subject, content); return "发送成功"; } } ``` 以上就是一个简单的使用Spring Boot发送邮件的示例代码,你可以根据自己的需要进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻D开始

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值