日志JavaAgent-NoClassDefFoundError

一、引言

        组内最近做了一个日志公共组件,用的是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.mzph.cn/news/199951.shtml

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

相关文章

GNN Maximum Flow Problem (From Shusen Wang)

Maximum Flow Problem ShusenWang 图数据结构和算法课程笔记 Slides Maximum Flow Problem Description Naive Algorithm Residual Capacity - FlowLeft: Original GraphRight: Residual Graph - Bottleneck capacity 2- Iteration 2:- Find an augmenting path: s -&g…

HTTP会话技术---Cookie、Session和Token介绍及它们在JavaWeb中的使用

当涉及到Web应用程序的身份验证和状态管理时&#xff0c;我们通常会使用到Cookie、Session和Token这些会话技术。下面是对它们的介绍&#xff0c;并在JavaWeb中的示例 Cookie&#xff08;HTTP Cookie&#xff09; Cookie是一种存储在用户浏览器中的小型文本文件&#xff0c;由…

python import 顺序以及自动实现import 顺序更改

核心风格: import 语句的模块顺序 我们推荐所有的模块在 Python 模块的开头部分导入。 而且最好按照这样的顺序: 1. Python 标准库模块 2. Python 第三方模块 3. 应用程序自定义模块 Isort 自动整理 import 的超实用工具教程-CSDN博客 使用isort实现import的自动排序 1.安装…

基于Springboot的在线问卷调查系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的在线问卷调查系统(有报告)。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring…

1-4节电池升降压充电IC解决方案

描述 MP2760是一款集成窄电压DC&#xff08;NVDC&#xff09;电源路径管理功能和USB On-the-Go(OTG)功能的升降压充电IC&#xff0c;兼容USB PD&#xff0c;适用于单节至4节串联的电池包应用。该芯片的充电输入电压范围广&#xff0c;可支持最高22V。 当启用电池放电模式&…

深入学习Synchronized各种使用方法

文章目录 前言一、synchronized关键字通用在下面四个地方&#xff1a;1.1synchronized修饰实例方法1.2synchronized修饰静态方法&#xff1a;1.3synchronized修饰实例方法的代码块1.4synchronized修饰静态方法的代码块2.读入数据 二.Sychronized关键特性2.1互斥2.2 刷新内存2.3…

CentOS 7 虚拟机java项目部署tomcat

首先安装java环境 下载安装包:jdk-19_linux-x64_bin.tar.gz_免费高速下载|百度网盘-分享无限制 (baidu.com) 将安装包上传到虚拟机 解压 tar zxvf jdk-19_linux-x64_bin.tar.gz 移动文件到 mv jdk-19.0.1 /usr/jdk-19.0.1 编辑配置文件 vim /etc/profile export JAVA…

selenium原理

selenium执行条件 1、测试脚本。可以是python、java等语言编写的测试脚本&#xff1b; 2、浏览器驱动&#xff08;webdriver&#xff09;。不同的版本、不同的浏览器都需要对应的驱动&#xff1b; 3、浏览器 测试脚本 执行原理 1、cmd命令&#xff0c;启动chromedriver.exe…

SAP-PP:PP顾问管理系统的相关建议

本博客将探讨生产计划领域的控制要点。这将有助于减少仓库库存不准确情况&#xff0c;因为库存不准确会导致实物库存、发货、成本核算和计划方面出现许多效率低下的问题。 在物料主数据关键字段中&#xff0c;必须配置计划交货时间、GR处理时间、内部生产时间、计划交货时间&a…

解决cad找不到msvcr100.dll的有效方法,完美修复dll问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是由于找不到msvcr100.dll文件而导致CAD软件无法正常运行的情况&#xff0c;系统无法找到所需的动态链接库文件。但是通过一些简单的解决方法&#xff0c;我们可以快速解决这个问题并继续我们的…

【动态规划】LeetCode-62.不同路径

&#x1f388;算法那些事专栏说明&#xff1a;这是一个记录刷题日常的专栏&#xff0c;每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目&#xff0c;在这立下Flag&#x1f6a9; &#x1f3e0;个人主页&#xff1a;Jammingpro &#x1f4d5;专栏链接&…

java -jar后台启动jar包

Linux系统启动&#xff08;后台&#xff09; nohup java -jar springboot-0.0.1-SNAPSHOT.jar & 查看日志 tail -500f nohup.out 查看进程号 ps -ef | grep java 关闭 kill -9 [进程号] Windows系统 java -jar springboot-0.0.1-SNAPSHOT.jar & Ctrlc或者关…

Flink之复杂事件处理CEP

复杂事件处理CEP Flink CEP基本使用添加依赖定义匹配模式定义匹配结果验证 模式Pattern API单个模式量词条件 组合模式跳过策略模式组匹配结果 应用示例自定义消息事件自定义Pattern测试 Flink CEP Flink的CEP (Complex Event Processing) 是指Flink提供的一种用于处理复杂事件…

ubuntu1804安装jupyter中的js环境

参考&#xff1a; https://github.com/n-riesco/ijavascript http://n-riesco.github.io/ijavascript/#installation https://github.com/n-riesco/ijavascript/issues/241 https://www.tomche.space/post/using-javascript-kernel-in-vscode-jupyter-notebooks/ https://w…

淘宝商品详情接口在电商运营中的应用实例

一、背景 某电商企业A在运营过程中&#xff0c;发现手动更新商品信息效率低下&#xff0c;且容易出现信息不一致的情况。为了解决这个问题&#xff0c;企业A决定采用淘宝商品详情接口&#xff0c;实现商品信息的自动获取和更新。 二、目标 通过集成淘宝商品详情接口&#xf…

HNU-计算机网络-讨论课2

第二次 有关网络智能、安全以及未来网络的讨论 一、必选问题&#xff08;每组自由选择N个&#xff0c;保证组内每人负责1个&#xff09; 网络的发展促进信息的传播&#xff0c;极大提高了人类的感知能力&#xff0c;整个世界都被纳入人类的感知范围。但人们对信息系统以及数据…

手持式安卓主板_PDA安卓板_智能手持终端方案

手持式安卓主板方案是一种智能终端设备&#xff0c;具备自动对焦和闪光灯功能&#xff0c;可以在昏暗的环境下快速扫描二维码并轻松采集数据。该方案还提供多渠道支付和数据采集功能&#xff0c;为用户提供了便捷的体验。 该方案的产品基于手持式安卓主板&#xff0c;并搭载了八…

海南省某部队实现资产管理和IP地址管理

在快速发展的网络环境中&#xff0c;如何有效管理资产和IP地址已成为众多组织面临的挑战。海南省某部队&#xff0c;作为一个肩负重要使命的单位&#xff0c;对此有着更为迫切的需求。为了应对这一挑战&#xff0c;他们选择了一个备受赞誉的系统管理平台——监控易&#xff0c;…

利用jQuery实现AJAX定时刷新局部页面实例

通过两种方法实例讲解ajax定时刷新局部页面&#xff0c;当然方法有很多种&#xff0c;也可以不使用ajax来刷新页面&#xff0c;可以使用jquery中的append来给指定内容加东西&#xff0c;但是都不太实用&#xff0c;最实用的方法还是ajax加载数据了。 方法一&#xff1a; 局部刷…

JAVA优化: MD5 加密的工具类

MD5 加密的工具类&#xff0c;提供了对字符串进行 MD5 加密的功能。主要包括以下几个方法&#xff1a; md5(String s)&#xff1a;对传入的字符串进行 MD5 加密&#xff0c;并返回加密后的字节数组。toHex(byte hash[])&#xff1a;将字节数组转换为十六进制字符串表示。hash(…