arthas命令logger動態修改日志級別--視頻演示


可以動態修改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”首發,歡迎關注交流,禁止第三方轉載。

技術類文章精選

無代碼文章精選


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM