可以動態修改
logger
的級別。
arthas命令logger
主要是用來處理日志記錄相關的功能,包括查看logger
和appenders
信息,包括classloader
,日志level
,codeSource
,日志文件名等等。其中最有用的就是修改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>-->
<!-- <!– Async Loggers will auto-flush in batches, so switch off immediateFlush. –>-->
<!-- <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>-->
<!-- <!– pattern layout actually uses location, so we need to include it –>-->
<!-- <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”首發,歡迎關注交流,禁止第三方轉載。
技術類文章精選
- Linux性能監控軟件netdata中文漢化版
- 圖解HTTP腦圖
- 性能測試中圖形化輸出測試數據
- JMeter吞吐量誤差分析
- 多項目登錄互踢測試用例
- JMeter如何模擬不同的網絡速度
- 手機號驗證碼登錄性能測試
- 綁定手機號性能測試