Spring Boot将错误日志发送到企微微信或钉钉群

1.创建 WeComAppender ,重写 AppenderBase 的 append 方法

复制代码
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
import cn.hutool.core.thread.ThreadUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;

import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.time.ZoneOffset;

/**
 * @author: joe
 */
public class WeComAppender extends AppenderBase<ILoggingEvent> {

    @Override
    protected void append(ILoggingEvent event) {
        try {
            // 按项目需求自定义拼装消息串,此处仅供参考
            StringBuilder sb = new StringBuilder();
            sb.append(event.getInstant().atOffset(ZoneOffset.ofHours(8)));
            sb.append(event);
            if (event.getThrowableProxy() != null) {
                sb.append(" ");
                sb.append(event.getThrowableProxy().getMessage());
            }
            // 异步请求,避免影响主线程
            ThreadUtil.execAsync(() -> sendHttpRequest(sb.toString()));
        } catch (Exception e) {
        }
    }

    /**
     * 发送请求
     * @param message
     */
    public void sendHttpRequest(String message) {
        try {
        	// 机器人 webhook 地址
            String webhookUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxxxxxxxxxxxxxxxxx";
            URL url = new URL(webhookUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json; utf-8");
            connection.setRequestProperty("Accept", "application/json");
            connection.setDoOutput(true);

            // 企微机器人固定的请求结构,详情请参考企微文档(钉钉的请参考钉钉文档)
            String jsonInputString = "{\"msgtype\": \"text\", \"text\": {\"content\": \"\"}}";
            JSONObject jsonObject = JSON.parseObject(jsonInputString);
            jsonObject.getJSONObject("text").put("content", message);

            try (OutputStream os = connection.getOutputStream()) {
                byte[] input = jsonObject.toString().getBytes(StandardCharsets.UTF_8);
                os.write(input, 0, input.length);
            }
            int responseCode = connection.getResponseCode();
        } catch (Exception e) {
        }
    }
}

2.配置 logback.xml

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- WECOM:企微告警 -->
    <!-- class 设置为 WeComAppender -->
    <appender name="WECOM" class="com.kjwl.framework.logback.WeComLogbackAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        	<!-- 日志等级为 ERROR -->
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %level [%thread] %logger{36} %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="WECOM" />
    </root>

</configuration>
相关推荐
升鲜宝供应链及收银系统源代码服务7 小时前
升鲜宝供应链管理系统-生鲜配送系统_分拣端界面重构设计(一)
spring boot·重构·开源·收银系统·生鲜门店·升鲜宝多门店收银系统
JaguarJack7 小时前
PHP 基金会宣布:Streams 现代化 将引入事件循环与异步新能力
后端·php
Mos_x7 小时前
HeidiSQL导入与导出数据
java·后端
oak隔壁找我7 小时前
Elasticsearch QueryBuilders 高级使用案例
java·后端
Zhang青山7 小时前
【玩转全栈】----Django基本配置和介绍
java·后端
勇敢牛牛_8 小时前
Rust真的适合写业务后端吗?
开发语言·后端·rust
JIngJaneIL8 小时前
财务管理|基于SprinBoot+vue的个人财务管理系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·毕设·财务管理系统
L.EscaRC8 小时前
Kafka在Spring Boot生态中的浅析与应用
spring boot·分布式·kafka
不爱学英文的码字机器8 小时前
深度解析《AI+Java编程入门》:一本为零基础重构的Java学习路径
java·人工智能·后端·重构