DevilKing's blog

冷灯看剑,剑上几分功名?炉香无需计苍生,纵一穿烟逝,万丈云埋,孤阳还照古陵

0%

Arthas Log Bug追查

原文链接

利用arthas直接在线上定位问题的过程,主要使用 scgetstatic命令。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ sc io.netty.channel.nio.NioEventLoop
class-info io.netty.channel.nio.NioEventLoop
code-source file:/opt/app/plugins/tair-plugin/lib/netty-all-4.0.35.Final.jar!/
name io.netty.channel.nio.NioEventLoop
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name NioEventLoop
modifier final,public
annotation
interfaces

super-class +-io.netty.channel.SingleThreadEventLoop
+-io.netty.util.concurrent.SingleThreadEventExecutor
+-io.netty.util.concurrent.AbstractScheduledEventExecutor
+-io.netty.util.concurrent.AbstractEventExecutor
+-java.util.concurrent.AbstractExecutorService
+-java.lang.Object

class-loader +-tair-plugin's ModuleClassLoader
classLoaderHash 73ad2d6

通过查看源码,了解相关的logger的实现

1
2
3
$ getstatic -c 73ad2d6 io.netty.channel.nio.NioEventLoop logger 'getClass().getName()'
field: logger
@String[io.netty.util.internal.logging.Slf4JLogger]

tair插件里的logback没有设置ROOT logger,所以它的默认level是DEBUG,并且默认的appender会输出到stdout里。

一些经验

  • logback默认的ROOT logger level是 DEBUG,输出是stdout
  • 利用arthas的 sc命令定位具体的类
  • 利用arthas的 getstatic获取static filed的值
  • 利用logger parent层联的特性,可以向上一层层获取到ROOT logger的配置