线上排查问题神器Arthas应用(五)-不发版修改生产环境日志级别

200 阅读2分钟

「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战

实时修改生产环境的日志级别

这个功能也很好用,通常,我们在日志中打印的日志级别一般是infor、warn、error级别的,debug日志一般看不到。那么出问题的时候,一些日志,在写代码的时候会被记录在debug日志中,而此时日志级别又很高。那么迫切需要调整日志级别。

这个功能很好用啊,我们可以将平时不经常打印出来的日志设置为debug级别。设置线上日志打印级别为info。当线上有问题的时候,可以将日志级别动态调整为debug。异常排查完,在修改回info。这对访问量特别大日志内容很多的项目比较有效,可以有效节省日志输出带来的开销。

第一步:使用logger命令查看日志级别

image

  • 当前应用的日志级别是info
  • 类加载的hash值是18b4aac2

我们定义一个接口,其源代码内容如下:

@PostMapping(value = "test")
    public String test() {
        log.debug("这是一条 debug 级别的日志");
        log.info("这是一条 info 级别的日志");
        log.error("这是一条 error 级别的日志");
        log.warn("这是一条 warn 级别的日志");
        return "完成";
    }

可以调用接口,查看日志输出代码。

image

我们看到,日志输出的是info及以下的级别。

第二步:修改logger日志的级别

logger -c 18b4aac2 --name ROOT --level debug

修改完日志级别以后,输出日志为debug级别。

image

8. 查询jvm信息,并修改----当发生内存溢出时,可以手动设置打印堆日志到文件

通常查询jvm参数,使用的是Java自带的工具[jinfo 进程号]。arthas中通过vmoption获取jvm参数:

image

假设,我们要设置JVM出现OutOfMemoryError的时候,自动dump堆快照

vmoption  HeapDumpOnOutOfMemoryError true

image

这时,如果发生堆内存溢出,会打印日志到文件

9. 监控函数耗时

trace 待监控方法的全类名  待监控的方法名
trace com.lxl.jvm.DeadLockTest generatorUser

img

  • 通过圈起来的部分可以看到,接口的入口函数time总耗时371ms
  • 其中getDataFromDb函数耗时200ms
  • getDataFromRedis函数耗时100ms
  • getDataFromOuter函数耗时50ms
  • process函数耗时20ms

很明显,最慢的函数已经找到了,接下里就要去对代码进行进一步分析,然后再进行优化

先介绍这些主要得工具,其他工具参考文档arthas.aliyun.com/doc/advance…