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

引言

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

本文目的是把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";

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/261387.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

​TrustZone之可信固件

Trusted Firmware是Armv8-A设备的安全世界软件的开源参考实现。Trusted Firmware为SoC开发人员和OEM提供了一个符合相关Arm规格&#xff08;包括TBBR和SMCC&#xff09;的参考Trusted代码库。 以下图表显示了Trusted Firmware的结构&#xff1a; SMC调度程序处理传入的SMC。SMC…

深入了解海外代理IP——代理IP类型区别详解,以及如何获取?

代理充当您的设备和您访问的网站之间的中介&#xff0c;掩盖您的 IP 地址并保护您的身份。但是&#xff0c;并非所有代理都是相同的&#xff0c;接触过的小伙伴都知道&#xff0c;代理IP有很多种类型&#xff0c;每种类型都有针对特定目的的特点&#xff0c;因此在选择之前&…

华为交换机,配置OSPF与BFD联动示例

OSPF简介 定义 开放式最短路径优先OSPF&#xff08;Open Shortest Path First&#xff09;是IETF组织开发的一个基于链路状态的内部网关协议&#xff08;Interior Gateway Protocol&#xff09;。 OSPF把自治系统AS&#xff08;Autonomous System&#xff09;划分成逻辑意义上…

FPGA模块——以太网芯片MDIO读写

FPGA模块——以太网MDIO读写 MDIO接口介绍MDIO接口代码&#xff08;1&#xff09;MDIO接口驱动代码&#xff08;2&#xff09;使用MDIO驱动的代码 MDIO接口介绍 MDIO是串行管理接口。MAC 和 PHY 芯片有一个配置接口&#xff0c;即 MDIO 接口&#xff0c;可以配置 PHY 芯片的工…

原生微信小程序中使用-阿里字体图标-详解

步骤一 1、打开阿里巴巴矢量图标库 网址&#xff1a;iconfont-阿里巴巴矢量图标库 2、搜索字体图标&#xff0c;鼠标悬浮点击添加入库 3、按如下步骤添加到自己的项目 步骤二 进入微信开发者工具 1、创建 fonts文件夹 > iconfont.wxss 文件&#xff0c;将刚才的代码复制…

Spring Boot学习随笔- 文件上传和下载(在线打开、附件下载、MultipartFile)

学习视频&#xff1a;【编程不良人】2021年SpringBoot最新最全教程 第十二章、文件上传、下载 文件上传 文件上传是指将文件从客户端计算机传输到服务器的过程。 上传思路 前端的上传页面&#xff1a;提交方式必须为post&#xff0c;enctype属性必须为multipart/form-data开发…

【STL容器】详解list的使用和模拟实现

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; STL函数专栏 &#x1f319;请不要相信胜利就像山坡上的蒲公英一…

Axure--中继器(增删改查)

&#x1f4da;&#x1f4da; &#x1f3c5;我是bing人&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Axure》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一…

龙迅LT86102UXE HDMI一分二HDMI,支持音频剥离,支持4K60HZ

描述&#xff1a; 龙迅 LT86102UXE HDMI2.0 分路器具有符合 HDMI2.0/1.4 规范的 1&#xff1a;2 分路器、最大 6Gbps 高速数据速率、自适应均衡 RX 输入和预加重 TX 输出&#xff08;用于支持长电缆应用&#xff09;、内部 TX 通道交换以实现灵活的 PCB 布线。 LT86102UXE HDM…

Python importlib模块详细教程

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com importlib模块是Python标准库中用于动态导入模块的工具。它提供了一系列函数&#xff0c;允许以编程方式加载、检查和操作模块。本文将深入探讨importlib的各种用法&#xff0c;并通过丰富的示例代码帮助你更好地…

Python 时间日期处理库函数

标准库 datetime >>> import datetime >>> date datetime.date(2023, 12, 20) >>> print(date) 2023-12-20 >>> date datetime.datetime(2023, 12, 20) >>> print(date) 2023-12-20 00:00:00 >>> print(date.strfti…

fv悬浮球恢复备份配置主界面闪退问题解决方法

错误环境&#xff1a; 闪退版本120.0.6099.43 正常版本104.0.5112.97 当fv悬浮球恢复过往的备份配置后打开出现主界面闪退&#xff0c;但是其他功能仍然一切正常&#xff0c;例如应用启动器&#xff0c;分享保存 问题原因&#xff1a;因为安卓系统以往的Android System Web…

Iview Tooltip显示不换行,被遮挡

部分使用slot 方式无法解决 <Tooltip placement"top"> <Button>多行</Button> <div slot"content"> <p>显示多行信息</p> <p><i>可以自定义样式</i></p> </div> </Tooltip> 所以…

完整的 nuxt3 + vue + ts 服务端渲染项目搭建教程,克隆就能用,新手必学,建议收藏

目录 前言 一、新建仓库 1.1 新建 gitee 仓库 1.2 克隆到本地 二、初始化 nuxt 项目 2.1 初始化 nuxt 2.1.1 使用什么包管理工具 2.1.2 是否初始化 git仓库 2.1.3 整理项目结构 2.1.4 提交代码 2.2 运行项目 2.2.1 运行 npm run dev 2.2.2 增加 .nvmrc 文件 2.2.…

孩子还是有一颗网安梦——Bandit通关教程:Level 16 → Level 17

&#x1f575;️‍♂️ 专栏《解密游戏-Bandit》 &#x1f310; 游戏官网&#xff1a; Bandit游戏 &#x1f3ae; 游戏简介&#xff1a; Bandit游戏专为网络安全初学者设计&#xff0c;通过一系列级别挑战玩家&#xff0c;从Level0开始&#xff0c;逐步学习基础命令行和安全概念…

对大学生创新创业某赛事目前存在的烂尾楼现象的一些研究的分享(1)

经过对”某某网”大学生创新创业大赛国赛第五届-第八届部分金奖项目的研究&#xff0c;进行较为充分的信息溯源、穿透调查&#xff0c;我发现不少项目存在赛事材料画大饼&#xff0c;严重不切合实际&#xff0c;参赛人员并非真正创新创业&#xff0c;赛后迅速销声匿迹、烂尾切割…

MFC 消息映射机制

目录 消息映射机制概述 宏展开 宏展开的作用 消息映射机制的执行流程 消息处理 消息映射机制概述 MFC的消息映射映射机制是可以在不重写WindowProc虚函数的大前提下&#xff0c;仍然可以处理消息。 类必须具备的要件 类内必须添加声明宏 DECLARE_MESSAGE_MAP() 类外…

刷题记录第五十一天-去除重复字母

题目要求的是字典序最小的结果。只需要理解一点就是按大小顺序排列的字符串的字典序就是最小的&#xff0c;如“abcd”这种。 解题思路如下&#xff1a; 首先明确要使用栈结构&#xff0c;并且是从栈底到栈顶递增&#xff0c;要尽可能保证递增&#xff0c;这样就能保证字典序最…

exsi 6.5 添加RTL8111/8168/8411 网卡驱动重新打包

参考安装esxi时候的No Network Adapters报错 解决办法-CSDN博客 lspci 查看网卡型号 RTL8111/8168/8411 PCI Express 驱动下载地址 List of currently available ESXi packages - V-Front VIBSDepot Wiki 注入驱动程序 https://vibsdepot.v-front.de/tools/ESXi-Customi…

mysql 23-2day 数据库查询(DQL)

目录 数据库查询(DQL)环境&#xff1a;准备一个表格作为查询环境查看数据根据要求查看数据运算查询as 可以修改字段名字 进行查询查询所有部门拼接两个字段查询 2017年入职的员工一个是空null 一个是空白查询 NULL集合排序查询查看有那些组通配符正则查询函数 数据库查询(DQL) …