引言
项目部署到服务器上之后,有错误日志和异常无法及时响应和查看。
本文目的是把logback的error级别日志通过群聊机器人推送到企业微信上。
ps:本文教程默认你的项目已经整合了logback日志框架
知识点引入
-
Appender: logback 将写入日志事件的任务委托给一个名为 Appender 的组件。
-
AppenderBase是一个抽象类,实现了 Appender 接口。
更多关于Appender的知识点可以去logback中文文档查看:第四章:Appenders - logback
继承AppenderBase
创建一个抽象类AbstractAlarmAppender继承AppenderBase
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.classic.spi.ThrowableProxy;
import ch.qos.logback.core.AppenderBase;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
/**
* error日志处理类
*
*/
public abstract class AbstractAlarmAppender extends AppenderBase<LoggingEvent> {
@Override
protected void append(LoggingEvent eventObject) {
try {
Level level = eventObject.getLevel();
if (Level.ERROR != level) {
// 只处理error级别的报错
return;
}
//构造消息通知内容
String message = initMessage(eventObject);
//发送消息通知
monitor(message);
} catch (Exception e) {
addError("日志报警异常,异常原因:{}", e);
}
}
/**
* 拼接异常消息体
*/
String initMessage(LoggingEvent eventObject) {
//获取异常堆栈信息
IThrowableProxy proxy = eventObject.getThrowableProxy();
String track = "";
String trackMessage = "";
if (proxy != null) {
Throwable t = ((ThrowableProxy) proxy).getThrowable();
//避免堆栈消息过长,截取前1000个字符
track = t.toString().length() <= 1000 ? t.toString() : t.toString().substring(0, 1000);
trackMessage = Arrays.toString(t.getStackTrace()).length() <= 1000 ? Arrays.toString(t.getStackTrace()) : Arrays.toString(t.getStackTrace()).substring(0, 1000);
}
String template = "异常来源: %s \n日志内容: %s \n异常时间: %s \n异常描述: %s \n详细信息:\n %s";
return String.format(template,
//LoggerName表示生成该日志记录器的名字,即打印日志的类的完整类路径
eventObject.getLoggerName(),
//日志内容
eventObject.getFormattedMessage(),
//异常时间
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()),
//异常描述(异常类型)
track,
//异常堆栈信息
trackMessage);
}
protected abstract void monitor(String messageText);
}
实现AbstractAlarmAppender类
创建实现类WechatAlarmAppender继承上面的AbstractAlarmAppender
import com.alibaba.fastjson.JSON;
import org.springblade.common.utils.HttpUtils;
import java.util.HashMap;
import java.util.Map;
/**
* 异常日志消息提醒
*
*/
public class WechatAlarmAppender extends AbstractAlarmAppender {
//这里替换为你的机器人的webHookUrl
String webHookUrl = "https://xxxxx";
/**
* 可以改写monitor方法来实现给其他软件发送通知、或者发邮件
* @param messageText 消息文本
*/
@Override
protected void monitor(String messageText) {
Map<String, Object> text = new HashMap<>();
text.put("content", messageText);
Map<String, Object> body = new HashMap<>();
//消息类型 这是是设置markdown类型
body.put("msgtype", "markdown");
body.put("markdown", text);
//调用企业微信接口发送消息
HttpUtils.sendPost(webHookUrl, JSON.toJSONString(body), null);
}
}
企业微信机器人发消息接口文档
参数 | 必填 | 说明 |
---|---|---|
msgtype | 是 | 消息类型,此时固定为markdown |
content | 是 | 文本内容,最长不超过2048个字节,必须是utf8编码 |
logback.xml文件配置 增加
在logback.xml加上这一行配置,把class的内容替换为你的WechatAlarmAppender类路径
<appender name="ALARM" class="org.test.modules.common.WechatAlarmAppender"/>
在logback.xml的root里面添加一行配置,注意ref="ALARM"的值对应appender的name值
<root level="INFO">
<appender-ref ref="ALARM"/>
</root>
效果
在项目中打印一个error日志,就会发送一个企业微信消息到群聊中,如下图所示。
上图日志格式是我调整了markdown日志格式,你可以通过修改AbstractAlarmAppender类的变量template来实现,如下我加了一个加粗格式
String template = "**异常来源:** %s \n**日志内容:** %s \n**异常时间:** %s \n**异常描述:** %s \n**详细信息:**\n %s";
更多格式配置可以查阅 企业微信开发者手册:群机器人配置说明 - 接口文档 - 企业微信开发者中心