来看看设计日志组件SDK的基操

一、总览

设计一个日志组件来监控业务中的流程节点;我们需要分三步;

  1. 获取数据
  2. 整理数据
  3. 上传数据

二、获取数据

  1. 日常项目中使用的日志组件有:logback
  • log4j:

    • 优点:成熟稳定,灵活性高,性能良好,社区支持强大。
    • 缺点:异步日志处理较慢,日志轮转处理不够完善。
  • SLF4J:

    • 优点:提供抽象层,易于集成,可插拔性。
    • 缺点:性能开销,配置稍显复杂。
  • logback:

    • 优点:性能优异,功能丰富,集成log4j优点,社区支持良好。
    • 缺点:配置复杂,学习曲线较陡。

怎么能获取到logback中的日志数据呢:

主要基于logback的扩展接口实现了自定义logback appender。

一个自定义Appender的基本步骤:

  1. 创建自定义Appender类: 创建一个类,继承自ch.qos.logback.core.Appender接口,并实现append方法。
  2. 配置自定义Appender: 在Logback的配置文件中,引用你的自定义Appender,并指定其处理日志的方式。
  3. 使用自定义Appender: 在你的应用程序中,使用Logger对象将日志事件添加到你的自定义Appender。
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.spi.AppenderAttachableImpl;
import ch.qos.logback.core.spi.FilterReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class CustomAppender extends AppenderAttachableImpl<Object> {private static final Logger logger = LoggerFactory.getLogger(CustomAppender.class);@Overrideprotected void append(Object eventObject) {// 这里是你自定义的日志处理逻辑logger.info("Custom Appender Event: {}", eventObject);}// 你可以添加初始化方法,或者实现其他Appender的方法
}

在Logback的配置文件中引用你的自定义Appender:

<configuration><appender name="customAppender" class="com.yourpackage.CustomAppender"><!-- 这里可以添加额外的配置,例如过滤器或者布局 --></appender><root level="info"><appender-ref ref="customAppender" /></root></configuration>

三、整理数据

这部分我们的目标就是整理数据---->我们需要的数据;有哪些?

  1. 服务名
  2. 项目组(指定范围的日志)—不上传数据
  3. 类名
  4. 方法名
  5. 日志信息
public class LogMessage {private String systemName;private String className;private String methodName;private List<String> logList;.......
}

接下来我们就需要获取数据;数据来源就是上述我们开发的自定义的Appender;

// 获取日志
if (eventObject instanceof ILoggingEvent) {ILoggingEvent event = (ILoggingEvent) eventObject;String methodName = "unknown";String className = "unknown";StackTraceElement[] callerDataArray = event.getCallerData();if (null != callerDataArray && callerDataArray.length > 0) {StackTraceElement callerData = callerDataArray[0];methodName = callerData.getMethodName();className = callerData.getClassName();}if (!className.startsWith(groupId)){return;}// 构建日志LogMessage logMessage = new LogMessage(systemName, className, methodName, Arrays.asList(event.getFormattedMessage().split(" ")));
}

这样我们就获得了需要的数据;

四、上传数据

上述操作将log中的message保存到了实体中;接下来我们就上传数据(发布数据);这里我们采用的是redis;使用成本比较低;后续可以通过接口实现策略模式来扩充多种上传方式:rockermq、kafka等等;

public interface IPush {/**用于初始化redis链接*/void open(String host, int port);void send(LogMessage logMessage);}

在具体实现中实例化redis后进行监听对应的主题:xbhog-monitor-sdk-topic

public synchronized void open(String host, int port) {/**确保项目中只实例化一次redis*/if (null != redissonClient && !redissonClient.isShutdown()) return;Config config = new Config();config.setCodec(JsonJacksonCodec.INSTANCE);config.useSingleServer().setAddress("redis://" + host + ":" + port).setConnectionPoolSize(64).setConnectionMinimumIdleSize(10).setIdleConnectionTimeout(1000).setConnectTimeout(1000).setRetryAttempts(3).setRetryInterval(1000).setPingConnectionInterval(0).setKeepAlive(true);this.redissonClient = Redisson.create(config);//redis的发布订阅RTopic topic = this.redissonClient.getTopic("xbhog-monitor-sdk-topic");topic.addListener(LogMessage.class, new Listener());
}

最后就可以在Appender进行数据的上传了;

......
push.send(logMessage);

redis的监听部分如下:

import org.redisson.api.listener.MessageListener;
class Listener implements MessageListener<LogMessage> {@Overridepublic void onMessage(CharSequence charSequence, LogMessage logMessage) {logger.info("接收消息:{}", JSON.toJSONString(logMessage));}
}

最后效果img

五、总结

  1. 通过自定义logback Appender来设计日志组件,以监控业务流程节点的三个步骤:获取、整理和上传日志数据。
  2. 整理数据阶段,从日志中提取服务名、类名、方法名等信息,构建LogMessage对象。
  3. 上传数据阶段,使用Redis发布订阅模式实现日志消息的发送和监听。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows平台RTSP|RTMP播放器如何实时调节音量

我们在做Windows平台RTSP、RTMP播放器的时候&#xff0c;有这样的技术需求&#xff0c;特别是多路监控的时候&#xff0c;并不是每一路audio都需要播放出来的&#xff0c;所以&#xff0c;这时候&#xff0c;需要有针对音量调节的设计&#xff1a; /** smart_player_sdk.cs* C…

★ C++基础篇 ★ 栈和队列

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将继续和大家一起学习C基础篇第八章----栈和队列 ~ 目录 一 容器适配器 二 deque的简单介绍 2.1 deque的原理介绍 2.2 deque vector list 的优缺点 2.2.1 vector 2.2.2 list 2.2.3 deque 2.3 为什么选择deq…

ECMAScript性能优化技巧与陷阱

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言 ECMAScript&#xff0c;即JavaScript&#xff0c;是一种广泛应用于Web开发中的脚本语言。随着现代Web应用的复杂度日益增加&#xff0c;如何优化JavaScript的性能变得至关重要。性能优化不仅能提高应用的响应速度&#x…

排序算法【冒泡排序】

一、原理 冒泡排序的原理比较简单&#xff0c;就是将待排序区域的数值挨个向后对比&#xff0c;直到比较到已排序的边界&#xff0c;就纳入已排序区域。 二、代码如下所示&#xff1a; #include <stdio.h> #include "test.h"/* 冒泡排序 */ void bubble_sort(…

【JavaEE】深入浅出:Spring Boot配置文件全解析

目录 SpringBoot 配置⽂件配置⽂件作⽤SpringBoot配置⽂件 配置⽂件快速⼊⼿配置⽂件的格式properties 配置⽂件说明properties 基本语法读取配置⽂件properties 缺点分析 yml 配置⽂件说明yml 基本语法yml 使⽤进阶yml 配置不同数据类型及 null配置对象配置集合配置Map yml优缺…

NVDLA专题1:NVDLA框架介绍

NVDLA概述 深度学习的计算部分主要可以分为4部分&#xff1a;卷积、激活单元&#xff08;神经元&#xff09;、池化和归一化。由于每个运算模块都有比较独特的共享特征&#xff0c;因此非常适合给每个模块设计一个对应的特殊硬件实现&#xff1a;内存访问模式容易预测并且很容…

边缘智能:让每一个温室都成为计算中心

&#xff08; 于景鑫 国家农业信息化工程技术研究中心&#xff09;当人工智能的浪潮席卷全球&#xff0c;大语言模型&#xff08;LLM&#xff09;引领智能风潮之时&#xff0c;"智慧农业"也摩拳擦掌跃跃欲试。设施农业作为现代农业的翘楚&#xff0c;正站在数智化变革…

社交媒体分析:如何利用Facebook的数据提升业务决

在数字化时代&#xff0c;社交媒体已经成为企业战略中不可或缺的一部分。Facebook&#xff0c;作为全球最大的社交平台之一&#xff0c;提供了丰富的数据资源&#xff0c;这些数据不仅能够帮助企业了解市场趋势&#xff0c;还能提升业务决策的精准度。本文将探讨如何有效利用Fa…

四路一体行车记录仪,语音提示注意行人,保障车辆行驶安全

在叉车、货车、客车等行业中&#xff0c;随着运输业务量的不断增加&#xff0c;行车安全问题已经成为了一大难题。经常会发生车祸、司乘人身安全无保障、货物损失等意外情况&#xff0c;这些事件不仅会给企业带来经济损失&#xff0c;也会影响对应行业的整体形象。 如何提高运…

深入了解指针(7)

文章目录 1.qrost的使用2.qrost函数的模拟实现 1.qrost的使用 qrost—库函数—可以实现任意数据类型的快速排序。 void qsort(void* base, //base中存放的是待排序数组的第一个元素的地址 size_t num, //num存放的是base指向的数组中的元素个数 size_t size, //size是base指向…

《学会 SpringBoot 系列 · spring.factories 详解》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

mysql 物理备份 MySQL 全量备份 增量备份 差异备份 日志备份万字长文 1.3万字

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循版权协议&#xff0c;转载请附上原文出处链接和本声明 注意&#xff0c;通常 完备增备&#xff0c;日志&#xff08;binlog)备&#xff0c;结合使用 差异则根据具体情况选用。 此备份过程 属于公司 常用的单个数据…

凹凸纹理概念

1、凹凸纹理 纹理除了可以用来进行颜色映射外&#xff0c;另外一种常见的应用就是进行凹凸映射。凹凸映射的目的是使用一张纹理来修改模型表面的法线&#xff0c;让我们不需要增加顶点&#xff0c;而让模型看起来有凹凸效果。原理&#xff1a;光照的计算都会利用法线参与计算&…

数的个位相加

给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。返回这个结果。 示例 1: 输入: num 38输出: 2 解释: 各位相加的过程为&#xff1a; 38 --> 3 8 --> 11 11 --> 1 1 --> 2 由于 2 是一位数&#xff0c;所以返回 2。…

搜维尔科技:驾驶模拟器背后的技术: Varjo的虚拟/混合现实 (VR/XR)提供独特的优势,最终加快汽车开发创新的步伐

专业驾驶模拟器广泛应用于车辆开发&#xff0c;帮助汽车行业在开发过程的早期做出更好的设计决策。总体目标是为测试驾驶员提供最真实的驾驶体验&#xff0c;包括动态动作和声音&#xff0c;并测试控制算法或辅助系统等功能。环境越真实&#xff0c;驾驶员的体验就越接近最终车…

视觉SLAM ch3补充——在Linux中配置VScode以及CMakeLists如何添加Eigen库

ch3中的所有代码&#xff0c;除了在kdevelop中运行&#xff0c;还可以在VScode中运行。下面将简要演示配置过程&#xff0c;代码不再做解答&#xff0c;详细内容在下面的文章中。&#xff08;这一节中的pangolin由于安装过程中会出现很多问题&#xff0c;且后续内容用不到该平台…

自动化解决 reCAPTCHA v2:CapSolver 教程

对于那些经常进行网页爬取的人来说&#xff0c;你是否曾觉得 reCAPTCHA v2 就像是互联网版的过于严格的裁判员&#xff0c;总是在质疑你的真实性&#xff1f;但如果你能够轻松且合规地与这些裁判员达成和解&#xff0c;使你的网络搜索和自动化任务变得更顺畅&#xff0c;那该有…

k8s部署kubeadm init初始化不成功,coredns处于pending,master和nodes处于notready状态

声明&#xff1a;本文仅为个人学习笔记使用&#xff0c;解决方法参考原文&#xff1a; https://blog.csdn.net/Harry_mumu/article/details/132099876 在部署完k8s集群后&#xff0c;节点一直处于notready状态&#xff08;master和nodes&#xff09; 查看kubectl get pods -n…

全球海事航行通告解析辅助决策系统

“全球海事航行通告解析辅助决策系统”是一个针对海事行业设计的智能系统&#xff0c;旨在帮助海上导航和航运操作人员解析和应对全球发布的海事航行通告。 要做这样的系统我们必须要了解海事签派员的日常工作。 海事签派员&#xff0c;也称为船舶操作员或船运调度员&#xff0…

HanLP分词的使用与注意事项

1 概述 HanLP是一个自然语言处理工具包&#xff0c;它提供的主要功能如下&#xff1a; 分词转化为拼音繁转简、简转繁提取关键词提取短语提取词语自动摘要依存文法分析 下面将介绍其分词功能的使用。 2 依赖 下面是依赖的jar包。 <dependency><groupId>com.ha…