Arthas简单使用

2021-06-13  本文已影响0人  Lolipiza

起因是线上环境有个问题,但是方法又没有打印日志这就很头痛了,又不可能直接发个版本上线,查询了相关资料以后,发现Arthas可以简便的达到目的。

arthas的使用方法有很多:
方法一.无需在客户端做任何操作,只需要在服务器上现场下载arthas并使用

// 下载并启动
curl -O https://arthas.aliyun.com/arthas-boot.jar
(或wget https://......)
java -jar arthas-boot.jar

方法二.arthas安装到基础镜像

RUN if $MIRROR; then MAVEN_HOST=${MIRROR_MAVEN_HOST} ;ALPINE_HOST=${MIRROR_ALPINE_HOST} ; sed -i "s/dl-cdn.alpinelinux.org/${ALPINE_HOST}/g" /etc/apk/repositories ; fi && \
    # https://github.com/docker-library/openjdk/issues/76
    apk add --no-cache tini && \ 
    # download & install arthas
    wget -qO /tmp/arthas.zip "${MAVEN_HOST}/com/taobao/arthas/arthas-packaging/${ARTHAS_VERSION}/arthas-packaging-${ARTHAS_VERSION}-bin.zip" && \
    mkdir -p /opt/arthas && \
    unzip /tmp/arthas.zip -d /opt/arthas && \
    rm /tmp/arthas.zip

ENTRYPOINT ["/sbin/tini", "--", "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

方法三.在业务模块集成arthas

// 在pom加入依赖
 <dependency>
            <groupId>com.taobao.arthas</groupId>
            <artifactId>arthas-spring-boot-starter</artifactId>
            <version>${arthas.version}</version>
        </dependency>

配置yml:

arthas:
 # 通过http访问的端口
  http-port: 8563
  # 通过telnet访问的端口
  telnet-port: 3658
  session-timeout: 1800
  # 绑定的ip
  ip: 0.0.0.0

如果配置 arthas.telnetPort为 -1 ,则不监听 telnet端口。如果配置 arthas.telnetPort为 0 ,则随机telnet端口。arthas.httpPort类似
通过http访问:localhost:8563


使用:

// 输入需要查看的方法以及入参:
watch com.cmcc.hui.tv.service.display.impl.DisplayServiceImpl frame "target"
此时用户调用接口,arthas日志就会打印出调用这个方法的入参

使用 ctrl+C退出watch功能

其他具体功能见arthas官网:https://alibaba.github.io/arthas/

参考:https://www.cnblogs.com/linyb-geek/p/14756092.html

原理:
ASM是一个Java字节码操作框架,用来动态生成class或者增强class,cglib的底层就是它,arthas也是通过它实现对class的增强的;Arthas增强功能的核心是Enhancer和AdviceWeaver这两个类,对方法进行Aop织入,达到watch,trace等效果
https://zhuanlan.zhihu.com/p/115127052


后续:因为之前在业务pod上使用javaagent的方式运行skywalking,我直接在业务上运行arthas就报错了,但不是一定会报错,猜想可能是和SW代理了同一个方法导致出现问题,待研究

上一篇 下一篇

猜你喜欢

热点阅读