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;
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.hi.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>