记一次线上故障:日志暴涨

前言背景

上周三早上连续受到报警信息,提示某某服务器磁盘满了,请开发同窗尽快处理!java

二话不说先拿出电脑,分析一下服务器的日志,发现有这样的日志记录出现了一千三百多万次linux

msgWorker - thread-16 - xxxMessageListener ... 具体内容省略

因为以前的日志里是不会打印这些消息日志的,因此,我猜想是否是日志级别设置错了。并且这个消息打印的类并不在项目源码里,而是依赖的jar包中,问题大概是知道了,应该是日志依赖jar包冲突了。git

由于系统是线上运行的,因此知道某个类里采用哪一个日志框架和使用何种日志级别都是个问题!不过,还好有阿里的Arthas,让你能够轻松解决这类线上问题。github

问题排查过程

在这里插入图片描述
由于咱们的线上机器都是将arthas集成到docker镜像里的,因此只须要启动arthas程序便可。docker

1. 首先问题日志的级别和框架

logger --name xxx.xxx.xxx //类的全限定名

在这里插入图片描述
能够看到,该类的级别是DEBUG,同时用的是logback日志框架,而咱们的应用程序用的log4j,所以能够判定是日志依赖冲突。shell

2. 肯定logback来自哪些依赖jar包

sc -d ch.qos.logback.classic.Logger

在这里插入图片描述
依赖的jar包可能有不少,可是只须要找到项目中那些直接引用的jar包便可,最终定位到两个jar包。服务器

  1. 一个是xxx-client最近有升级,查看升级以前的版本,发现是没有logback-classic的依赖的。
  2. 另外一个是这个messageListener的jar包,而咱们的pom文件里只排除了logback-core的依赖。

对应的解决方案也很简单,新升级的xxx-clieng包,去除logback-core,logback-classic的依赖;原有messageListener的jar包,增长logback-classic的排除,问题解决,整个问题定位过程不超过30分钟。框架

回归正题

做为java研发工程师,常常会遇到线上问题,不少线上问题的难点在于说,程序的运行时状态你不清楚,好比:curl

  1. 本文开头的,日志jar包冲突致使的,磁盘写满问题
  2. 程序逻辑出错,线上系统没法debug
  3. 机器频繁GC,系统运行时详情

等等,这些问题,arthas均可以帮助你一步一步解决线上问题。jvm

Arthas简介

安装

主要有两种安装方式

##1.第一种方式 arthas-boot.jar
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar

## github访问较慢,可使用国内的gitee
curl -O https://arthas.gitee.io/arthas-boot.jar

##2.第二种方式 as.sh
curl -L https://alibaba.github.io/arthas/install.sh | sh
## 能够将路径配置到环境变量,运行便可
./as.sh

安装完成后,attach到某个java进程上,能够看到启动后的界面
在这里插入图片描述

Arthas功能分类总结

1.系统运行时指标

## 该命令主要是输出系统的实时数据,包括线程,内存等,能够快速了解系统情况
dashboard

## jvm类命令,能够辅助帮助排查jvm相关问题
## 1. 系统环境变量
sysprop 
## 2. jvm环境变量
sysenv 
## 3. jvm参数
vmoption

2. 代码级别功能

2.1 拦截某个方法,获取其入参,出参以及异常信息

## params,returnObj, throwExp分别表明入参,出参和异常信息, n,x 表示拦截次数和参数展现深度
watch 类全名 方法名 "{params, returnObj, throwExp}" -n 10 -x 5

在这里插入图片描述
2.2 你也能够对方法路径进行追踪,使用trace命令

trace 类全名 方法名 -n 5
## or
stack 类全名 方法名 -n 5

上面两种方法能够解决线上运行逻辑的检查,很是实用!

3. 类加载相关功能

有时,咱们须要知道某个类是由哪一个类加载器加载的,或者说有些动态生成的类,咱们如何知道其源码内容等,这些跟类加载相关的功能,arthas都有相关的功能支持。

## sc (search class),能够查找该类由哪些类加载,由哪些包加载
sc -d 类全名
## sm (search method),和上面的命令类似
## jad java class decompile,java类反编译工具,对于动态代理的类有奇效
jad --source-only 类全名@hashcode
## 你甚至能够动态修改某个类的源码,而后从新加载该个类!
jad 反编译,而后修改源码文件
mc 编译java文件,生成.class文件
redefine 从新加载.class文件

其实,arthas还有火焰图以及ognl表达式相关的功能,可让你了解应用程序存在哪些热点方法,以及让你更细致的了解深层的java对象,限于篇幅,有兴趣的你们能够至Arthas官网学习。

IDEA插件

插件名称:arthas-idea
插件地址:https://plugins.jetbrains.com/search?search=arthas-idea

能够离线安装,也能够在IDE内插件中搜索arthas-idea直接安装。

好了,本篇文章就结束了,但愿搞java的后台工程师能够尝试一下这个生产力工具,遇到线上问题不慌,一步步地解决问题!

相关文章
相关标签/搜索