起因是线上环境有个问题,但是方法又没有打印日志这就很头痛了,又不可能直接发个版本上线,查询了相关资料以后,发现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代理了同一个方法导致出现问题,待研究
网友评论