arthas命令logger动态修改日志级别--视频演示

摘要:
可以动态修改logger的级别。arthas命令logger主要是用来处理日志记录相关的功能,包括查看logger和appenders信息,包括classloader,日志level,codeSource,日志文件名等等。其中最有用的就是修改logger的级别,这个功能可以在不重启JVM的情况下,打开debug调试日常,在完成排查之后,再修改为正常的info级别,对于线上排查问题来讲,非常有帮助。arthas命令logger命令点击观看视频log4j2配置文件%m%n"/˃˂!

可以动态修改logger的级别。

arthas命令logger主要是用来处理日志记录相关的功能,包括查看loggerappenders信息,包括classloader,日志levelcodeSource,日志文件名等等。其中最有用的就是修改logger的级别,这个功能可以在不重启JVM的情况下,打开debug调试日常,在完成排查之后,再修改为正常的info级别,对于线上排查问题来讲,非常有帮助。当然有用的前提是,日志规范执行到位,如果开发压根没有输出debug日志,那就无能为力了,不过这难不倒arthas,还会有更牛的命令来实现这个功能,以后我会继续分享演示视频。

我项目使用的是log4j2,在xml配置上跟官方Demo有些区别,所以教程基于log4j2,如果使用log4j的童鞋也是可以使用的。

arthas命令logger命令

log4j2配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="WARN" monitorInterval="30">
    <!--先定义所有的appender-->
    <appenders>
        <!--这个输出控制台的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="%-4p-> %m%n"/>
            <!--            <PatternLayout pattern="[%-4p] %d - %t %L:%M %m %n"/>-->
            <!--            <PatternLayout pattern="%d %-4p (%F:%L) - %m%n"/>-->
        </console>
        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
        <!--        <File name="log" fileName="log/fun.log" append="false">-->
        <!--            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>-->
        <!--        </File>-->
        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileInfo"
                     fileName="log/info.log"
                     filePattern="log/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{HH:mm:ss} %-4level %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="2 MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>


        <RollingFile name="RollingFileWarn" fileName="log/warn.log"
                     filePattern="log/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{HH:mm:ss} %-4level %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="2 MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>
    </appenders>
    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <root level="info">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
        </root>
    </loggers>
<!--    异步日志记录的配置-->
<!--    <Appenders>-->
<!--        &lt;!&ndash; Async Loggers will auto-flush in batches, so switch off immediateFlush. &ndash;&gt;-->
<!--        <RandomAccessFile name="RandomAccessFile" fileName="asyncWithLocation.log"-->
<!--                          immediateFlush="false" append="false">-->
<!--            <PatternLayout>-->
<!--                <Pattern>%d %p %class{1.} [%t] %location %m %ex%n</Pattern>-->
<!--            </PatternLayout>-->
<!--        </RandomAccessFile>-->
<!--    </Appenders>-->
<!--    <Loggers>-->
<!--        &lt;!&ndash; pattern layout actually uses location, so we need to include it &ndash;&gt;-->
<!--        <AsyncLogger name="com.foo.Bar" level="trace" includeLocation="true">-->
<!--            <AppenderRef ref="RandomAccessFile"/>-->
<!--        </AsyncLogger>-->
<!--        <Root level="info" includeLocation="true">-->
<!--            <AppenderRef ref="RandomAccessFile"/>-->
<!--        </Root>-->
<!--    </Loggers>-->
</configuration>

Demo代码

package com.fun

import com.fun.frame.httpclient.FanLibrary
import org.slf4j.Logger

class TSSS extends FanLibrary {

    public static Logger logger = getLogger(TSSS.class)

    public static void main(String[] args) {
        while (true) {
            logger.debug("我是debug信息!")
            logger.info("我是info信息!")
            logger.warn("我是warn信息!")
            logger.error("我是error信息!")
            sleep(3000)
        }

    }


}


  • 郑重声明:“FunTester”首发,欢迎关注交流,禁止第三方转载。

技术类文章精选

无代码文章精选

免责声明:文章转载自《arthas命令logger动态修改日志级别--视频演示》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Window命令行切换命令贴现率d与利率i下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【效率工具】史上最好用的SSH一键登录脚本,第三版更新!

说明 时隔一周,GotoSSH又迎来了一次重大更新,让这个史诗级的shell工具变得更加丝般顺滑了~ 这次的主要更新是对自定义全局命令以及自定义属性的支持,让设置更加灵活,此外,对各个细节进行了调整,并修复了一些极少数情况下可能会发生的bug。 另外,最重要的一点是,对代码进行了大量优化和注释,让小白也能很轻松的看懂各个地方是在做什么事情,毕竟对于服务器信...

【一】、.net core 3.1 创建windows服务并集成Serilog的步骤记录

1、新建项目   选择“Worker Service”,如下图: 2、添加nuget引用   Microsoft.Extensions.Hosting.WindowsServices   Serilog.Extensions.Hosting   Serilog.Sinks.Console   Serilog.Sinks.File 3、修改Program的...

isequal 和startswith 使用

如果要把不同服务器发送过来的日志保存到不同的文件, 可以这样操作: :fromhost-ip, isequal, “192.168.0.160″ /var/log/host160.log :FROMHOST-IP, isequal, “192.168.0.161″ /var/log/host161.log :FROMHOST-IP, startswith,...

RabbitMQ 的配置文件

Ubuntu系统上RabbitMQ的配置文件应该存储在/etc/rabbitmq/rabbitmq.conf 如果没有,在RabbitMQ的启动log里面会有如下的信息: Starting RabbitMQ 3.7.7 on Erlang 21.0 Copyright (C) 2007-2018 Pivotal Software, Inc. Licen...

删除或重命名文件夹和文件的方法

删除或重命名文件夹和文件的办法 一、Linux、CentOS下重命名文件和文件夹mv:move 用移动文件命令就可以了,因为linux系统没有专门的重命名命令。基本格式:移动文件:mv 文件名 移动目的地文件名重命名文件:mv 文件名 修改后的文件名示例:mv oldfilename newfilename (oldfilename为旧文件名,newfil...

nodejs momentjs操作时间(24小时制)

var moment = require('moment'); console.log(moment().format("YYYY-MM-DD HH:mm:ss")); //当前时间 (24小时制) console.log(moment().add(1, "hours").format("YYYY-MM-DD HH:mm:ss")); //当前时...