说明:记录一次使用Arthas排查测试环境正在运行的项目BUG;
场景
有一个定时任务,该定时任务是定时去拉取某FTP服务器上的文件,进行备份、读取、解析等一系列操作。
而现在,因为开发环境是Windows, 线上项目是LInux,两个操作系统的路径分隔符不同,Windows是反斜杠(\),Liunx是斜杠(/),而我如果在本地起项目进行排查,就需要去更换代码中的相关路径,等于是用Windows系统下的代码,去操作LInux上的文件(FTP服务器是在Linux环境里的),相当麻烦。
于是我考虑用Arthas来进行排查。
排查
首先,通过分析日志,我知道代码保存的地方就在下面try代码块里,因为日志中有打印异常信息;
这部分代码进行了两部分的文件操作,而从结果来看,是后面这部分的FTP操作造成了异常,于是我在这段代码中间,加入了一段日志,如下:
然后,将这部分的代码在本地进行编译,找到对应的.class文件(本地起项目,然后在target目录里找到对应类的class文件),上传到服务器。进入Arthas界面,使用redefine
命令,后面跟上class文件在服务器上的路径,热更新代码;
此时,再触发一下定时任务,查看日志信息,出现了新增的这部分日志,打印了ftp文件路径,如下:
将打印出来的路径与实际的路径一比较,发现就是路径错误,最后一个文件夹名对不上,淦!幸运的是,这个路径是写在数据库里面的,所以修改数据库中的路径或者修改实际FTP服务器上的文件夹名使其能对应上,两种方法都可以。
最后
本文图片打码较多,有些细节图片也没能截出来,大家仅供参考。文章主要是传递一个观点,如果你只想给项目加一行日志信息,千万不要去写代码 => commit and push => merge => package => 构建,用Arthas的redefine命令热更新代码,非常方便,值得选择。