Java使用arthas修改日志级别详解

目录

arthas能够更改日志的级别,下面是logger的用法

查看logger信息,更新logger level

查看所有logger信息 logger

以下面的logback.xml为例:

<?xml version="1.0" encoding="UTF-8"?><configuration>    <appender name="APPLICATION" class="ch.qos.logback.core.rolling.RollingFileAppender">        <file>app.log</file>        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">            <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>            <maxFileSize>100MB</maxFileSize>            <maxHistory>60</maxHistory>            <totalSizeCap>2GB</totalSizeCap>        </rollingPolicy>        <encoder>            <pattern>%logger{35} - %msg%n</pattern>        </encoder>    </appender>     <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">        <appender-ref ref="APPLICATION" />    </appender>     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">        <encoder>            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n            </pattern>            <charset>utf8</charset>        </encoder>    </appender>     <root level="INFO">        <appender-ref ref="CONSOLE" />        <appender-ref ref="ASYNC" />    </root></configuration>

sc -d *FormulaEngine |grepclassLoaderHash

sc -d FormulaEngine.class*

使用logger命令打印的结果是:

[arthas@2062]$ logger name                                   ROOT class                                  ch.qos.logback.classic.Logger classLoader                            sun.misc.Launcher$AppClassLoader@2a139a55 classLoaderHash                        2a139a55 level                                  INFO effectiveLevel                         INFO additivity                             true codeSource                             file:/Users/hengyunabc/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar appenders                              name            CONSOLE                                        class           ch.qos.logback.core.ConsoleAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        target          System.out                                        name            APPLICATION                                        class           ch.qos.logback.core.rolling.RollingFileAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        file            app.log                                        name            ASYNC                                        class           ch.qos.logback.classic.AsyncAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        appenderRef     [APPLICATION]

appenders的信息里,可以看到

CONSOLElogger的target是System.out

APPLICATIONlogger是RollingFileAppender,它的file是app.log

ASYNC它的appenderRefAPPLICATION,即异步输出到文件里

查看指定名字的logger信息 logger -n org.springframework.web

[arthas@2062]$ logger -n org.springframework.web name                                   org.springframework.web class                                  ch.qos.logback.classic.Logger classLoader                            sun.misc.Launcher$AppClassLoader@2a139a55 classLoaderHash                        2a139a55 level                                  null effectiveLevel                         INFO additivity                             true codeSource                             file:/Users/hengyunabc/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar

查看指定classloader的logger信息

注意hashcode是变化的,需要先查看当前的ClassLoader信息,提取对应ClassLoader的hashcode。

如果你使用-c,你需要手动输入hashcode:-c <hashcode>

[arthas@2062]$ logger -c 2a139a55 name                                   ROOT class                                  ch.qos.logback.classic.Logger classLoader                            sun.misc.Launcher$AppClassLoader@2a139a55 classLoaderHash                        2a139a55 level                                  DEBUG effectiveLevel                         DEBUG additivity                             true codeSource                             file:/Users/hengyunabc/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar appenders                              name            CONSOLE                                        class           ch.qos.logback.core.ConsoleAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        target          System.out                                        name            APPLICATION                                        class           ch.qos.logback.core.rolling.RollingFileAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        file            app.log                                        name            ASYNC                                        class           ch.qos.logback.classic.AsyncAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        appenderRef     [APPLICATION]

对于只有唯一实例的ClassLoader可以通过--classLoaderClass指定class name,使用起来更加方便:

logger --classLoaderClass sun.misc.Launcher$AppClassLoader

注: 这里classLoaderClass 在 java 8 是 sun.misc.Launcher$AppClassLoader,而java 11的classloader是jdk.internal.loader.ClassLoaders$AppClassLoader。

--classLoaderClass的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而-c <hashcode>是动态变化的。

更新logger level 找到需要修改日志级别的类

命令:

sc -d FreeResourceQueryActionImpl.class*

或者

sc -d *FreeResourceQueryActionImpl | grep classLoaderHash

结果:目的就是为了找出classLoaderHash

修改

[arthas@2062]$ logger --name ROOT --level debugupdate logger level success.

指定classloader更新 logger level

默认情况下,logger命令会在SystemClassloader下执行,如果应用是传统的war应用,或者spring boot fat jar启动的应用,那么需要指定classloader。

可以先用sc -d yourClassName来查看具体的 classloader hashcode,然后在更新level时指定classloader:

[arthas@2062]$ logger -c 2a139a55 --name ROOT --level debug

查看没有appender的logger的信息

默认情况下,logger命令只打印有appender的logger的信息。如果想查看没有appender的logger的信息,可以加上参数--include-no-appender

注意,通常输出结果会很长。

[arthas@2062]$ logger --include-no-appender name                                   ROOT class                                  ch.qos.logback.classic.Logger classLoader                            sun.misc.Launcher$AppClassLoader@2a139a55 classLoaderHash                        2a139a55 level                                  DEBUG effectiveLevel                         DEBUG additivity                             true codeSource                             file:/Users/hengyunabc/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar appenders                              name            CONSOLE                                        class           ch.qos.logback.core.ConsoleAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        target          System.out                                        name            APPLICATION                                        class           ch.qos.logback.core.rolling.RollingFileAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        file            app.log                                        name            ASYNC                                        class           ch.qos.logback.classic.AsyncAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        appenderRef     [APPLICATION]  name                                   com class                                  ch.qos.logback.classic.Logger classLoader                            sun.misc.Launcher$AppClassLoader@2a139a55 classLoaderHash                        2a139a55 level                                  null effectiveLevel                         DEBUG additivity                             true codeSource                             file:/Users/hengyunabc/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar  name                                   com.alibaba class                                  ch.qos.logback.classic.Logger classLoader                            sun.misc.Launcher$AppClassLoader@2a139a55 classLoaderHash                        2a139a55 level                                  null effectiveLevel                         DEBUG additivity                             true codeSource                             file:/Users/hengyunabc/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar...

退出arthas

为了不影响性能,解决完问题需要退出arthas

如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。

如果想完全退出arthas,可以执行stop命令。

退出之前恢复原来的日志级别

到此这篇关于Java使用arthas修改日志级别详解的文章就介绍到这了,更多相关Java arthas内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java动态追踪技术探究之从JSP到Arthas

    从JSP说起 对于大多数Java程序员来说,早期的时候,都会接触到一个叫做JSP(Java Server Pages)的技术.虽然这种技术,在前后端代码分离.前后端逻辑分离.前后端组织架构分离的今天来看,已经过时了,但是其中还是有一些有意思的东西,值得拿出来说一说. 当时刚刚处于Java入门时期的我们,大多数精力似乎都放在了JSP的页面展示效果上了: "这个表格显示的行数不对" "原来是for循环写的有问题,改一下,刷新页面再试一遍" "嗯,好了,表格显示

  • java定位死锁的三种方法(jstack、Arthas和Jvisualvm)

    目录 死锁 死锁发生的原因 死锁发生的条件 1:通过jstack定位死锁信息 1.2:查看死锁线程的pid 2:通过Arthas工具定位死锁 3. 通过 Jvisualvm 定位死锁 死锁的预防 总结 死锁 死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 死锁发生的原因 死锁的发生是由于资源竞争导致的,导致死锁的原因如下: 系统资源不足,如果系统资源充足,死锁出现的可能性就很低. 进程(线程)运行推进的顺序不合适. 资源分配

  • 详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类

    目录 阅读Dubbo源码过程中,会发现,Dubbo消费端在做远程调用时,默认通过 Javassist 框架为服务接口生成动态代理类,调用javassist框架下的JavassistProxyFactory类的getProxy(Invoker invoker, Class<?>[] interfaces)方法,动态生成一个存放在JVM中的动态代理类. public <T> T getProxy(Invoker<T> invoker, Class<?>[] in

  • Arthas在线java进程诊断工具在线调试神器详解

    `Arthas` 是 Alibaba 开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,`Arthas`可以帮助你解决: 1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! 5. 是否有一个全局视角来查看系统的运

  • java之生产故障定位Arthas问题

    目录 生产故障定位Arthas Arthas(阿尔萨斯)能为你做什么? java诊断工具Arthas(watch命令)方法观察神器 watch 参数说明 生产故障定位Arthas Arthas(阿尔萨斯)能为你做什么? Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱.当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?

  • Java线上问题排查神器Arthas实战原理解析

    概述 背景 是不是在实际开发工作当中经常碰到自己写的代码在开发.测试环境行云流水稳得一笔,可一到线上就经常不是缺这个就是少那个反正就是一顿报错抽风似的,线上调试代码又很麻烦,让人头疼得抓狂:而且debug不一定是最高效的方法,遇到线上问题不能debug了怎么办.原先我们Java中我们常用分析问题一般是使用JDK自带或第三方的分析工具如jstat.jmap.jstack. jconsole.visualvm.Java Mission Control.MAT等.但此刻的你没有看错,还有一款神器Art

  • 使用arthas命令redefine实现Java热更新(推荐)

    arthas 是一个 Java 开源诊断神器. 今天分享一个非常重要的命令 redefine ,主要作用是加载外部的 .class 文件,用来替换 JVM 已经加载的类,总结起来就是实现了 Java 的热更新. redefine 在一下几种情况中会失败:1.增加了 field :2.增加了 method :3.替换正在运行的方法. 前两个比较好理解,第三个意思就是这个方法必须结束之后才会被替换,如果有个方法开始运行之后就不会跳出,那么这个方法所在的类是无法被替换的,类似无限循环的方法. 中间提到

  • Java开源诊断工具Arthas使用方法详解

    一.前言 1.热更新代码的场景 (1)当线上服务器出现问题时,有些时候现有的手段不足以发现问题所在,可能需要追加打印日志或者增加一些调试代码,如果我们去改代码重新部署,会破坏问题现场,可以通过热部署的手段来增加调试代码 (2)线上出现紧急bug,通过Review代码找到问题,修改好后打包部署的流程可能比较久,可以通过热部署代码及时解决问题 二.使用阿里巴巴开源的Java诊断工具 ---Arthas,他可以附着在我们的Java服务器进程上面,查看服务器状态,jvm状态等各种参数指标,还可以进行热更

  • Java使用arthas修改日志级别详解

    目录 arthas能够更改日志的级别,下面是logger的用法 查看logger信息,更新logger level 查看所有logger信息 logger 以下面的logback.xml为例: <?xml version="1.0" encoding="UTF-8"?><configuration> <appender name="APPLICATION" class="ch.qos.logback.cor

  • 如何调整Docker中nginx的日志级别详解

    目录 Intro Nginx Dockerfile New conf More References Intro 最近发现我们的一个应用产生了很多日志,而这些日志大多都是 nginx 的 access_log,我们默认会把标准输出收集到 es 里分析应用日志,但是很多都是 access_log 就可能会掩盖掉真实的错误日志,所以可能有时候我们并不想输出这些 access_log,示例如下: Nginx Dockerfile 去 Github 上扒了一下 Nginx 的 Dockerfile, d

  • Java Spring事务的隔离级别详解

    目录 引言 数据库访问的并发性问题 事务的隔离级别 悲观锁和乐观锁 总结 引言 之前关于事务的文章已介绍了事务的概念以及事务的四个属性(ACID),相信你对事务应该有所认识和了解. 本篇文章是关于事务的隔离性,介绍数据库提供的多种隔离级别. 数据库访问的并发性问题 所谓事务的隔离性,其实事务的这个属性是针对数据库访问的并发性问题而言的. 那何谓数据库访问的并发性问题呢? 所谓数据库访问的并发性问题是指多个事务可以同时访问数据库中的数据,而当多个事务在数据库中并发执行(同时执行)时,数据的一致性可

  • java高并发的并发级别详解

    目录 阻塞 无饥饿(Starvation-Free) 无障碍(Obstruction-Free) 无锁(Lock-Free) 等待 总结 阻塞.无饥饿.无障碍.无锁.无等待几种. 阻塞 一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行.当我们使用synchronized关键字或者重入锁时,我们得到的就是阻塞的线程. synchronize关键字和重入锁都试图在执行后续代码前,得到临界区的锁,如果得不到,线程就会被挂起等待,直到占有了所需资源为止. 无饥饿(Starvation-

  • log4j2动态修改日志级别及拓展性使用详解

    一.供参考的完整日志配置 <?xml version="1.0" encoding="UTF-8"?> <!-- 配置LoggerConfig,即Appenders的日志级别为WARN --> <Configuration status="WARN"> <!-- 定义下面的引用名 --> <Properties> <property name="basePath"

  • Java Fluent Mybatis 分页查询与sql日志输出详解流程篇

    目录 前言 准备数据 Sql日志配置 官方分页查询 PageHelper分页查询 总结 前言 接着我上一章:Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下 上一章我把项目做了一部分工程化包装,主要还是想要之后的调试能够方便一些.那么这一章接着上一章的内容,做一下查询分页,并且将每次请求所调用的sql语句写在日志里面,便于我们观察定位问题.代码之后还是会上传到github. GitHub代码仓库地址:GitHub仓库 准备数据 简单的准备了一些数据. Sql日志配置 之

  • JAVA基于Slack实现异常日志报警详解

    目录 一.功能介绍 二.Slack介绍 三.前期准备 slack配置 pom.xml 四.具体实现 1.实现Slack发送消息 SlackUtil 给Slack发消息工具类 向 webhook发起请求通过Urlencode SlackUtil测试 2.重写打印日志类 常见异常打日志处理 重写封装打印日志的方法 测试日志类 五.优化扩展想法 其他代码 一.功能介绍 在我们日常开发中,如果系统在线上环境上,发生异常,开发人员不能及时知晓来修复,可能会造成重大的损失,因此后端服务中加入异常报警的功能是

  • springboot使用logback文件查看错误日志过程详解

    这篇文章主要介绍了springboot使用logback文件查看错误日志过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 <?xml version="1.0" encoding="UTF-8"?> <!-- 从高到地低 OFF . FATAL . ERROR . WARN . INFO . DEBUG . TRACE . ALL --> <!-- 日志输出规则 根据当前ROOT

  • Java Spring Boot消息服务万字详解分析

    目录 消息服务概述 为什么要使用消息服务 异步处理 应用解耦 流量削峰 分布式事务管理 常用消息中间件介绍 ActiveMQ RabbitMQ RocketMQ RabbitMQ消息中间件 RabbitMQ简介 RabbitMQ工作模式介绍 Work queues(工作队列模式) Public/Subscribe(发布订阅模式) Routing(路由模式) Topics(通配符模式) RPC Headers RabbitMQ安装以及整合环境搭建 安装RabbitMQ 下载RabbitMQ 安装R

  • Java基础之Filter的实例详解

    Java基础之Filter的实例详解 定义: Filter,是Servlet的一种,接口类为javax.servlet.Filter,以一种模块化或者可重用的方法封装公共行为,本质是可复用的代码片段. 职责:在请求到达Servlet之前对请求头作预处理,或者在服务器响应完成之后对响应内容作后处理.分界线为chain.doFilter的调用.该调用是将请求处理权交给其Filter列表链上的其它Filter. 生命周期:  Filter在Web容器启动时被容器实例化,并调用其init方法完成初始化,

随机推荐