Оповещение о боевой электронной почте SpringBoot на основе журнала исключений

Java задняя часть Spring

Это пятый день моего участия в августовском испытании обновлений, подробности о мероприятии:Испытание августовского обновления

Оповещение о боевой электронной почте SpringBoot на основе журнала исключений

Я считаю, что все мелкие партнеры, которые борются на передовой, будут очень обеспокоены работой своих собственных систем.Вообще говоря, компании с полной инфраструктурой будут иметь полный план аварийной сигнализации.Если мы небольшая компания, это не может быть из-за отсутствия инфраструктуры., просто потеряете способность восприятия объекта, если в нашей системе куча аномалий, но не могут до нас достучаться в реальном времени, то результат будет один - убить программиста и принести в жертву небу

В этой статье кратко представлена ​​идея реализации, основанная на журнале ошибок для реализации схемы оповещения по электронной почте.

I. Окружающая среда проекта

1. Зависимости проекта

Этот проект используетSpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEAразвивать

Откройте веб-сервис для тестирования

<dependencies>
    <!-- 邮件发送的核心依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
</dependencies>

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. Идеи дизайна

Основной отправной точкой следующего плана является то, что когда в программе возникает большое количество исключений, это указывает на то, что у большинства приложений есть проблемы и их нужно немедленно отправить владельцу проекта.

Для реализации этого решения ключевым моментом является восприятие и сообщение об аномальных явлениях.

  • Захват исключений и выходных журналов (это кажется стандартным, не говорите мне, что все еще есть приложения, которые не выводят файлы журналов...)
    • Для такого восприятия это может быть достигнуто с помощью механизма расширения logback, который будет описан позже.
  • Сообщение об отклонении от нормы: отправка электронной почты

Что касается использования электронной почты, рекомендуется обратиться к сообщению в блогеВведение в режим отправки электронной почты серии SpringBoot

2. Пользовательские приложения

Определите Appender для отправки ошибок, как показано ниже.

public class MailUtil extends AppenderBase<ILoggingEvent> {

    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. Пружинный контейнер

В приведенной выше отправке электронной почты вам необходимо использовать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. конфигурация журнала

Следующим шагом является использование Appender, который мы определили выше в конфигурации журнала.

logback-spring.xmlСодержимое файла следующее:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d [%t] %-5level %logger{36}.%M\(%file:%line\) - %msg%n</pattern>
            <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="errorAlarm" class="com.git.hui.demo.mail.util.MailUtil">
        <!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>


    <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
    <!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE  -->
    <!-- additivity=false 表示匹配之后,不再继续传递给其他的logger-->
    <logger name="com.git.hui" level="DEBUG" additivity="false">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="errorAlarm"/>
    </logger>

    <!-- 控制台输出日志级别 -->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

5. Протестируйте демо

Далее, давайте продемонстрируем, может ли он оправдать наши ожидания.

@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. Резюме

В этом сообщении в блоге в основном представлена ​​идея с помощью механизма расширения logback, чтобы реализовать привязку журнала ошибок и предупреждения по электронной почте, а также реализовать простой мониторинг исключений приложения.

Вышеупомянутая реализация является только прототипом, ее можно рассматривать как введение, есть дополнительные детали, которые можно обогатить, такие как

  • Уведомление Feishu/Dingding (с помощью машины Feishu Dingding для оповещения, оно более чувствительно, чем электронная почта)
  • В зависимости от типа аномалии различают раннее предупреждение
  • Более продвинутое ограничение частоты и т. д.

Здесь я рекомендую систему раннего предупреждения, исходный код которой я уже открывал ранее, которая может реализовать гибкую конфигурацию схемы раннего предупреждения, ограничение частоты, повышение важности и т. д.

III. Исходный код и связанные с ним знания, которые нельзя пропустить

0. Проект

Рекомендуемые похожие сообщения в блоге

1. Публичный аккаунт WeChat: блог Yihuihui

Это не так хорошо, как письмо. Вышеупомянутое содержание чисто из семьи. Из-за ограниченных личных способностей неизбежно есть упущения и ошибки. Если вы найдете ошибки или у вас есть лучшие предложения, вы можете критиковать и исправлять их. Спасибо ты очень.

Ниже представлен серый личный блог, в котором записываются все посты в блоге по учебе и работе, приглашаю всех посетить

  • One Grey BlogПерсональный блогblog.hhui.top
  • Серый блог - специальный весенний блогspring.hhui.top