Java日志框架打印應(yīng)用程序日志代碼的執(zhí)行情況分析
0 引言
- 我常以為 配置 INFO 日志級(jí)別時(shí), 應(yīng)用程序代碼中日志器(logger) debug 級(jí)的日志代碼,不會(huì)被執(zhí)行(比如,實(shí)驗(yàn)1中的
printTestLog函數(shù))。但今天線上的問(wèn)題,證實(shí)了這個(gè)思路是錯(cuò)的。

1 驗(yàn)證實(shí)驗(yàn)
- 版本信息
- 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] -->實(shí)驗(yàn)1:日志框架打印應(yīng)用程序日志代碼的執(zhí)行情況
日志配置策略: log4j2.properties
log4j2.properties
## 日志的等級(jí)(自定義配置項(xiàng))
##property.log.level=ALL,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF
property.log.level=DEBUG
# ------------------- [1.1] 定義 RootLogger 等 全局性配置(不可隨意修改) ------------------- #
## rootLogger, 根記錄器,所有記錄器的父輩
## 指定根日志的級(jí)別 | All < Trace < Debug < Info < Warn < Error < Fatal < OFF
rootLogger.level=${log.level}
... //略應(yīng)用程序代碼: LogTest
LogTest
package test.java.lang;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class LogTest {
public static String printTestLog(){
return "HelloWorld";//關(guān)鍵代碼行
}
public static void main(String[] args) {
log.debug( "log:{}", printTestLog() );
}
}實(shí)驗(yàn)結(jié)果
log.level=INFO時(shí)
關(guān)鍵代碼行 : 被執(zhí)行 日志輸出結(jié)果: 空
log.level=DEBUG時(shí)
關(guān)鍵代碼行 : 被執(zhí)行 日志輸出結(jié)果: [20XX/10/16 16:01:28.585] [TID: N/A] [DEBUG] [main] [LogTest.java:12 main] log:HelloWorld

最終結(jié)論
無(wú)論 應(yīng)用程序日志代碼 logger 使用何種日志級(jí)別打印日志,代碼行中的程序均會(huì)被執(zhí)行,只是最終輸出時(shí)由日志框架根據(jù)配置logger所屬class的日志級(jí)別決定是否輸出(appender)
解決方法1:應(yīng)用程序中,如無(wú)必要,刪除這類日志代碼。
解決方法2:
log.isDebugEnabled(...)/isInfoEnabled(...)/isWarnEnabled(...)/isErrorEnabled(...)/...
public static void main(String[] args) {
if(log.isDebugEnabled()){//將會(huì)根據(jù) 用戶所配置的日志級(jí)別(log.level),決定是否執(zhí)行 IF 內(nèi)的代碼
log.debug( "log:{}", printTestLog() );
}
}到此這篇關(guān)于Java日志框架打印應(yīng)用程序日志代碼的執(zhí)行情況的文章就介紹到這了,更多相關(guān)Java日志框架打印應(yīng)用程序日志代碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Java程序中使用數(shù)據(jù)庫(kù)的新方法
這篇文章主要介紹了在Java程序中使用數(shù)據(jù)庫(kù)的新方法,講述了Java8以來(lái)數(shù)據(jù)庫(kù)API的一些新特性,需要的朋友可以參考下2015-07-07
在Java中實(shí)現(xiàn)讓線程按照自己指定的順序執(zhí)行
這篇文章主要介紹了在Java中實(shí)現(xiàn)讓線程按照自己指定的順序執(zhí)行,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Spring Data Jpa如何實(shí)現(xiàn)批量插入或更新
文章總結(jié):本文分享了四種Spring Data JPA批量插入或更新的方法,包括BatchConsumer、QueryParameterBuilder、KeyValue和SqlUtil,旨在為開發(fā)者提供實(shí)用的參考2024-12-12
使用mybatis的interceptor修改執(zhí)行sql以及傳入?yún)?shù)方式
這篇文章主要介紹了使用mybatis的interceptor修改執(zhí)行sql以及傳入?yún)?shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot學(xué)習(xí)之Json數(shù)據(jù)交互的方法
這篇文章主要介紹了SpringBoot學(xué)習(xí)之Json數(shù)據(jù)交互的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
RestTemplate使用Proxy代理作為跳板發(fā)送請(qǐng)求
這篇文章主要為大家介紹了RestTemplate使用代理proxy作為跳板發(fā)送請(qǐng)求的方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03

