10分钟学会logback错误日志推送企业微信

发布时间:2023年12月21日

引言

项目部署到服务器上之后,有错误日志和异常无法及时响应和查看。

本文目的是把logback的error级别日志通过群聊机器人推送到企业微信上。

ps:本文教程默认你的项目已经整合了logback日志框架

知识点引入

  1. Appender: logback 将写入日志事件的任务委托给一个名为 Appender 的组件。

  2. 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日志,就会发送一个企业微信消息到群聊中,如下图所示。

image.png

上图日志格式是我调整了markdown日志格式,你可以通过修改AbstractAlarmAppender类的变量template来实现,如下我加了一个加粗格式

String template = "**异常来源:** %s \n**日志内容:** %s \n**异常时间:** %s \n**异常描述:** %s \n**详细信息:**\n %s";

更多格式配置可以查阅 企业微信开发者手册:群机器人配置说明 - 接口文档 - 企业微信开发者中心

文章来源:https://blog.csdn.net/m0_46193982/article/details/135138407
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。