Arthas 应用诊断利器学习及使用(八) 系统命令logger,getstatic,ognl,mbean

705 阅读3分钟

这是我参与更文挑战的第6天,活动详情查看: 更文挑战

本文内容基于arthas 3.5.2 版本,介绍系统命令logger,getstatic,ognl,mbean的使用及实现。

一.logger命令

查看logger信息,更新logger level

参数名称参数缩写参数说明必填项
--name-nlogger名可选
--classloader-c指定classloader的hashcode,默认为SystemClassLoader的可选
--classLoaderClass指定classloader可选
--level-l设置logger的level可选
--include-no-appender查看没有appender的logger的信息,默认为false可选

文件位于com.taobao.arthas.core.command.logger.LoggerCommand.java

默认调用方法loggers(process, name),其中name参数并未使用到,可以去除。
java.lang.instrument.Instrumentation#getAllLoadedClasses()获取已加载的class。 循环已加载的class,获取classloader,如果-c参数未传,classLoaderClass找到唯一匹配的classloader的hashCode。

根据class名判断是否是org.apache.log4j.Loggerch.qos.logback.classic.Loggerorg.apache.logging.log4j.Logger分别对应log4jlogbacklog4j2

如果是log4jloggerInfo,根据Log4jHelper.class helperClassNameWithClassLoader(classLoader, helperClass)获取class名, 尝试加载该class,若没找到,则尝试生成一个helper class。最后 通过反射调用getLoggers方法获取loggerInfo,循环输出classLoader名和classLoaderHash。

--name--level两个参数都存在时,则会更新logger打印级别。调用updateLevel()方法更新logger level,通过反射调用使用的logger的updateLevel更新level。

二.getstatic命令

通过getstatic命令可以方便的查看类的静态属性。

参数名称参数缩写参数说明必填项
class-pattern类名,用.或者/作为分隔必填
field-pattern字段属性名必填
expressognl表达式可选
--classloader-c指定classloader的hashcode,默认为SystemClassLoader的可选
--classLoaderClass指定classloader可选
--regex-E正则匹配默认模糊匹配可选
--expand-x展开显示对象层数,默认为1可选

文件位于com.taobao.arthas.core.command.klass100.GetStaticCommand.java

参数-c--classLoaderClass的逻辑与logger命令中的相同,这里不再赘述。

SearchUtils.searchClassOnly(inst, classPattern, isRegEx, hashCode)。根据classPattern找出唯一的class,如果返回多个class,则会进入processMatches提示需要使用参数-c来找到指定的class,否则进入processExactMatch方法,通过反射获取静态属性的值。

三.ognl命令

执行ognl表达式

参数名称参数缩写参数说明必填项
express执行的表达式必填
--classloader-c指定classloader的hashcode,默认为SystemClassLoader的可选
--classLoaderClass指定classloader可选
--expand-x展开对象层数,默认为1可选

文件位于com.taobao.arthas.core.command.klass100.OgnlCommand.java

ExpressFactory.unpooledExpress获取表达式结果

四.mbean命令

查看 Mbean 的信息。

|参数名称 |参数缩写 |参数说明 |必填项| |name-pattern| |名称表达式匹配| 可选| |attribute-pattern| |属性名表达式匹配| 可选| |--interval| -i |刷新属性值的时间间隔 (ms)| 可选| |--regex| -E |开启正则表达式匹配,默认为通配符匹配。仅对属性名有效| 可选| |--metadata| -m |查看元信息| 可选| |--number-of-execution| -n |刷新属性值的次数| 可选|

文件位于com.taobao.arthas.core.command.monitor200.MBeanCommand.java

image.png 当执行命令mbean的时候,参数name-pattern,为空,进入分支执行listMBean,执行queryObjectNames(),返回Mbean信息列表。

image.png

当执行命令mbean -m,参数metaData为true,进入分支执行listMetaData根据获取到的ObjectName,获取MBeanInfo。如果参数为mbean java.lang:type=OperatingSystem,则执行listAttribute,该方法将会启动一个定时任务,设置了--interval的将会定时刷新属性。