日志JavaAgent-NoClassDefFoundError

news2024/11/29 8:34:57

一、引言

        组内最近做了一个日志公共组件,用的是javaagent的方式,之前搞的maven jar包每次都要把所有系统都发一遍,太麻烦。

        javaagent通过Java虚拟机(JVM)的Instrumentation API来实现代码的侵入。通过Instrumentation API,Java agent可以在类加载过程中修改字节码,向目标代码中插入自定义的逻辑或进行其他操作。我们的组件使用bytebuddy进行字节码修改。

        今天发布系统会在流水线把这个日志组件带进去,然后就出现了SoaServiceLogAction java.lang.NoClassDefFoundError: Could not initialize class **.LogConfig。

二、分析

1、原因

        这个报错是很模糊的,根本不知道具体原因,正常有以下几种原因:

1. 缺少依赖:如果类 `**.LogConfig` 依赖于其他类或库,而这些依赖没有正确地被引入到项目中,就会导致找不到类的定义。

2. 类初始化失败:如果类的静态初始化块或静态字段初始化过程中发生异常,就会导致类初始化失败。这可能是因为初始化过程中的代码抛出了异常,或者依赖的资源无法访问或加载。

3. 类路径冲突:如果类 `**.LogConfig`在多个地方存在,可能会导致类路径冲突,从而无法正确加载类的定义。

2、组件

        还是要看下代码,这里只列出了出问题的地方,省略了排查其他代码的过程。

public class LogConfig {
private static Map<String, String> config = Config.get("**.properties").asMap();
public static String scenario() {
        return config.get(LOG_SCENARIO);
    }
}

        这个没有类没有被正确初始化才导致了NoClassDefFoundError,这个类在什么时候被调用呢?

3、JavaAgent

@Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class)
    public static void OnMethodExit(
        @Advice.AllArguments(readOnly = false, typing = Assigner.Typing.DYNAMIC) Object[] allArguments,
        @Advice.Thrown Throwable throwable) {
        try {
            if (StringUtils.isBlank(LogConfig.scenario())) {
            return;
        }
            //日志处理
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

        `@Advice.OnMethodExit` 是bytebuddy库中的一个注解,用于在方法退出时进行拦截和处理。它可以被用于在方法执行完毕后执行一些特定的逻辑,例如记录日志、统计方法执行时间等。

        这里可以看到判断一下对应的场景有没有配置使用日志组件。场景很多,有数据库、链路调用、mq等等,方便针对性的记录日志。

4、初始化分析

        LogConfig在每次调用或者操作DB的时候都会被调用其中的静态方法scenario,这时候就应该被初始化,说明这个方法有问题。因为静态方法属于类级别的方法,调用静态方法会导致类的初始化。在初始化过程中,会执行静态初始化块和静态字段的初始化操作。因此,在调用 `scenario()` 方法之前,类 `LogConfig` 的静态字段 `config` 会被初始化。

        那么会有什么问题呢?config字段也就是加载一下配置而已。如果配置不存在呢?作者想到这里看了一下配置中心,果然没有这个文件。

三、解决

        作者联系了系统对应的负责人加上**.properties这个文件,但是感觉组件应该在本地建一个文件,如果加载不到配置中心的也能加载到本地的。不然推广到其他部门的时候就会产生这种乌龙。

四、总结

        java agent做公共代码的抽离是个好方式,但是就像作者上次Log4j-tag丢失-CSDN博客发现的问题一样,不看组件源代码根本不知道发生了什么。也就要求研发人员对JavaAgent有一定的了解。

        下一期作者准备讲讲搭建和使用JavaAgent,有兴趣的同学点点关注。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

matlab diff和gradient

gradient 求解梯度。 示例 FX gradient(F) 返回向量 F 的一维数值梯度。输出 FX 对应于 ∂F/∂x&#xff0c;即 x&#xff08;水平&#xff09;方向上的差分。点之间的间距假定为 1。 使用方法&#xff1a; x -2:0.2:2; y x’; z x .* exp(-x.^2 - y.^2); [px,py] gradien…

K8S部署nginx并且使用NFS存储数据

安装NFS 在master安装NFS systemctl start nfs-server修改配置 /etc/exports /data *(rw,no_root_squash,no_all_squash,sync)目录为 /data 允许所有地址访问 验证下 [rootmaster nginx]# showmount -e 192.168.57.61 Export list for 192.168.57.61: /data *共享可以正常…

1.uniapp基础

1.uniapp基础 官方文档&#xff1a;uni-app官网 1.1开发工具 &#xff08;1&#xff09;工具&#xff1a; HBuilderX HBuilderX-高效极客技巧 1.2 新建项目 &#xff08;1&#xff09; 文件》新建项目 ​ &#xff08;2&#xff09;选择相应的配置信息&#xff0c;填写项目根路…

python超详细基础文件操作【建议收藏】

文章目录 前言1 文件操作1.1 文件打开与关闭1.1.1 打开文件1.1.2 关闭文件 1.2 访问模式及说明 2 文件读写2.1 写数据&#xff08;write&#xff09;2.2 读数据&#xff08;read&#xff09;2.3 读数据&#xff08;readlines&#xff09;2.3 读数据&#xff08;readline&#x…

数据结构 / 队列 / 循环队列 / 概念

1. 定义 为充分利用向量空间&#xff0c;克服假溢出现象的方法是&#xff1a;将向量空间想象为一个首尾相接的圆环&#xff0c;并称这种向量为循环向量。存储在其中的队列称为循环队列&#xff08;Circular Queue&#xff09;。循环队列是把顺序队列首尾相连&#xff0c;把存储…

正式发布! 加速科技ST2500A飙速赶来!

在新场景、新应用海量增长的驱动下&#xff0c;芯片测试需求也在日益多元化和快速扩展。加速科技始终致力于以客户的实际需求为导向&#xff0c;基于领先的半导体测试技术为千行百业提供全场景的测试解决方案&#xff0c;推出新一代ST2500A数模混合信号测试机。 ST2500A是基于…

(六)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、Tiki-taka算法&#xff08;TTA&#xf…

Linux-Linux安装JDK及配置环境 及 遇到的问题

下载linux环境对应的JDK的tar.gz包 配置JDK环境&#xff1a;编辑 sudo vim /etc/profile 在文件的最下方&#xff0c;填写 export JAVA_HOME/usr/local/src/software/jdk1.8 export CLASSPATH.:$JAVA_HOME/lib/tools.jar export PATH$JAVA_HOME/bin:$PATH 执行生效命令&…

UVM实现component之间transaction级别的通信

my_model是从i_agt中得到my_transaction&#xff0c;并把 my_transaction传递给my_scoreboard。在UVM中&#xff0c;通常使用TLM&#xff08;Transaction Level Modeling&#xff09;实现component之间transaction级别 的通信。 在UVM的transaction级别的通信 中&#xff0c;数…

Git介绍与安装使用

目录 1.Git初识 1.1提出问题 1.2如何解决--版本控制器 1.3注意事项 2.Git安装 2.1Linux-centos安装 2.2Linux-ubuntu安装 2.3Windows安装 3.Git基本操作 3.1创建Git本地仓库 3.2配置Git 4.认识⼯作区、暂存区、版本库 1.Git初识 1.1提出问题 不知道你工作或学习时…

Spring AOP解析

基本概念 之前写过如何实现方法增强&#xff0c;见链接&#xff1a;一篇文章了解如何实现方法增强&#xff0c;实现原理即采用的是AOP&#xff0c;那么本篇文章就主要是为了了解Spring AOP的实现。 面向切面编程&#xff08;Aspect Oriented Programming&#xff09; 在软件…

Apollo新版Beta技术沙龙,震撼来袭!

在2023年12月2日&#xff0c;我有幸参加百度Apollo举行的技术交流活动&#xff0c;Apollo是一个百度公司开发的开源的自动驾驶项目&#xff0c;这次线下技术交流让我对自动驾驶有了深入的了解。 在活动中&#xff0c;来自Apollo项目的专家们对 Apollo 技术的进行介绍和演示。他…

ValueError: not enough values to unpack (expected 3, got 2)

我在使用cv2.findContours函数中遇到以上错误&#xff0c;经查询找到该错误原因&#xff1a; 在 OpenCV 4.X 中&#xff0c;函数 cv2.findContours()仅有两个返回值&#xff0c; 其语法格式为&#xff1a; contours, hierarchy cv2.findContours( image, mode, method) 若不…

2023版本idea插件开发踩坑记录(一)

在进行idea开发的时候&#xff0c;开始仿照着写第一个插件hello world的时候&#xff0c;运行的时候一直运行不成功。参考了很多博客都是如此 后面对官方文档读了一遍&#xff0c;就发现其中的原委&#xff0c;这个的话估计会有很多人跟我一样踩坑 具体原因是&#xff0c;idea插…

你知道小红书小眼睛的推送机制吗?

明明很用心地发笔记&#xff0c;小眼睛就是不多&#xff0c;是不是你看到自己笔记的小眼睛低就头痛&#xff1f; 首先我们要知道小眼睛是什么&#xff01;推送机制是什么&#xff01;搞清楚才能把这项数据提升起来。

【上海大学《面向对象程序设计A》课程小项目报告】抽象向量类模板及其派生类

1 项目内容及要求 本项目通过设计一个抽象向量类模板&#xff0c;以及一个通用的向量类模板和一个字符串类作为其派生类&#xff0c;以满足各种应用场景中的数据存储和处理需求。 项目内容&#xff1a; 抽象向量类模板。派生向量类。派生字符串类。测试及异常处理。联合测试…

Redis SDS 源码

底层数据结构的好处&#xff1a; 杜绝缓冲区溢出。减少修改字符串长度时所需的内存重分配次数。二进制安全。兼容部分C字符串函数。 常用命令&#xff1a; set key value、get key 等 应用场景&#xff1a;共享 session、分布式锁&#xff0c;计数器、限流。 1、给char*定义…

【Java Web学习笔记】4 - DOM文档对象模型

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/javascript 零、在线文档 JavaScript HTML DOM 一、HTML DOM基本介绍 1. DOM全称是Document Object Model文档对象模型 文档<---映射--->对象 2.就是把文档中的标签&#xff0c;属性&#xf…

Java集合常见问题

目录 Java集合 1.前言2.集合3.Collection接口类3.1 List接口3.1.1 ArrayList&#xff08;常用&#xff09;3.1.2 LinkedList&#xff08;常用&#xff09;3.1.3 Vector&#xff08;不常用&#xff09; 3.2 Set接口3.2.1 HashSet&#xff08;常用&#xff09;3.2.2 LinkedHash…