Java日志框架打印應用程序日志代碼的執(zhí)行情況分析
0 引言
- 我常以為 配置 INFO 日志級別時, 應用程序代碼中日志器(logger) debug 級的日志代碼,不會被執(zhí)行(比如,實驗1中的
printTestLog
函數(shù))。但今天線上的問題,證實了這個思路是錯的。
1 驗證實驗
- 版本信息
- jdk : 1.8
- 日志組件
slf4j.version
: 1.7.25log4j.version
: 2.20.0
<!-- log [start] --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jul</artifactId> <!--<version>2.13.3</version>--> <version>${log4j.version}</version> <scope>compile</scope> </dependency> <!-- log [end] -->
實驗1:日志框架打印應用程序日志代碼的執(zhí)行情況
日志配置策略: log4j2.properties
log4j2.properties
## 日志的等級(自定義配置項) ##property.log.level=ALL,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF property.log.level=DEBUG # ------------------- [1.1] 定義 RootLogger 等 全局性配置(不可隨意修改) ------------------- # ## rootLogger, 根記錄器,所有記錄器的父輩 ## 指定根日志的級別 | All < Trace < Debug < Info < Warn < Error < Fatal < OFF rootLogger.level=${log.level} ... //略
應用程序代碼: LogTest
LogTest
package test.java.lang; import lombok.extern.slf4j.Slf4j; @Slf4j public class LogTest { public static String printTestLog(){ return "HelloWorld";//關鍵代碼行 } public static void main(String[] args) { log.debug( "log:{}", printTestLog() ); } }
實驗結果
log.level=INFO
時
關鍵代碼行 : 被執(zhí)行 日志輸出結果: 空
log.level=DEBUG
時
關鍵代碼行 : 被執(zhí)行 日志輸出結果: [20XX/10/16 16:01:28.585] [TID: N/A] [DEBUG] [main] [LogTest.java:12 main] log:HelloWorld
最終結論
無論 應用程序日志代碼 logger 使用何種日志級別打印日志,代碼行中的程序均會被執(zhí)行,只是最終輸出時由日志框架根據(jù)配置logger所屬class的日志級別決定是否輸出(appender)
解決方法1:應用程序中,如無必要,刪除這類日志代碼。
解決方法2:
log.isDebugEnabled(...)/isInfoEnabled(...)/isWarnEnabled(...)/isErrorEnabled(...)/...
public static void main(String[] args) { if(log.isDebugEnabled()){//將會根據(jù) 用戶所配置的日志級別(log.level),決定是否執(zhí)行 IF 內的代碼 log.debug( "log:{}", printTestLog() ); } }
到此這篇關于Java日志框架打印應用程序日志代碼的執(zhí)行情況的文章就介紹到這了,更多相關Java日志框架打印應用程序日志代碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
在Java中實現(xiàn)讓線程按照自己指定的順序執(zhí)行
這篇文章主要介紹了在Java中實現(xiàn)讓線程按照自己指定的順序執(zhí)行,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06Spring Data Jpa如何實現(xiàn)批量插入或更新
文章總結:本文分享了四種Spring Data JPA批量插入或更新的方法,包括BatchConsumer、QueryParameterBuilder、KeyValue和SqlUtil,旨在為開發(fā)者提供實用的參考2024-12-12使用mybatis的interceptor修改執(zhí)行sql以及傳入?yún)?shù)方式
這篇文章主要介紹了使用mybatis的interceptor修改執(zhí)行sql以及傳入?yún)?shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12SpringBoot學習之Json數(shù)據(jù)交互的方法
這篇文章主要介紹了SpringBoot學習之Json數(shù)據(jù)交互的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12RestTemplate使用Proxy代理作為跳板發(fā)送請求
這篇文章主要為大家介紹了RestTemplate使用代理proxy作為跳板發(fā)送請求的方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03