这是我参与更文挑战的第6天,活动详情查看: 更文挑战
本文内容基于arthas 3.5.2 版本,介绍系统命令logger,getstatic,ognl,mbean的使用及实现。
一.logger命令
查看logger信息,更新logger level
| 参数名称 | 参数缩写 | 参数说明 | 必填项 |
|---|---|---|---|
| --name | -n | logger名 | 可选 |
| --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.Logger,ch.qos.logback.classic.Logger,org.apache.logging.log4j.Logger分别对应log4j,logback,log4j2。
如果是log4j的loggerInfo,根据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 | 字段属性名 | 必填 | |
| express | ognl表达式 | 可选 | |
| --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。
当执行命令
mbean的时候,参数name-pattern,为空,进入分支执行listMBean,执行queryObjectNames(),返回Mbean信息列表。
当执行命令mbean -m,参数metaData为true,进入分支执行listMetaData根据获取到的ObjectName,获取MBeanInfo。如果参数为mbean java.lang:type=OperatingSystem,则执行listAttribute,该方法将会启动一个定时任务,设置了--interval的将会定时刷新属性。