log4j的使用及其原理
log4j的簡單使用方法
我的專案是mvn,ssm環境,需要debug環境下mybatis執行sql時列印對應sql和引數
1mvn引入相關包,在pom.xml中加入如下配置:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2log4j.properties檔案所在位置和內容
位置如下:
內容如下:
log4j.rootLogger=INFO,stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=[%p] %d{yyyy-MM-dd HH:mm:ss} %l: %m%n #此處com包,會包含com及其子目錄下的所有名稱空間 #log4j.logger.com=debug #推薦寫法如下,對應與mapper.xml中的namespace對應的名稱空間:<mapper namespace="com.ruisitech.bi.mapper.bireport.RhJobMapper"> log4j.logger.com.ruisitech.bi.mapper.bireport=debug log4j.logger.com.ibatis=debug log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug log4j.logger.java.sql.Connection=debug log4j.logger.java.sql.Statement=debug log4j.logger.java.sql.PreparedStatement=debug #log4j.logger.com.bonc.ext.engine = DEBUG, a2 #log4j.appender.a2=org.apache.log4j.FileAppender #log4j.appender.a2.layout=org.apache.log4j.PatternLayout #log4j.appender.a2.layout.ConversionPattern=[%p] %d{yyyy-MM-dd HH:mm:ss} %l: %m%n #log4j.appender.a2.File=E\:example.log #log4j.appender.a2.MaxFileSize= 100KB
有一點特別說明下:
log4j.logger.com.ruisitech.bi.mapper.bireport=debug中的om.ruisitech.bi.mapper.bireport是mapper.xml中的名稱空間 ,如:
<mapper namespace="com.ruisitech.bi.mapper.bireport.RhJobMapper">
com.ruisitech.bi.mapper.bireport 需要修改成你自己的名稱空間,否則不會生效!!!!!
3在debug模式下啟動web專案,會發現執行的時候會答應對應的sql了,效果如下圖:
4在java檔案中使用
import org.apache.log4j.Logger;
/**
* @author:mazhen
* @date:2018/10/31 11:31:
* @description:
*/
public class LoggerTest {
static Logger logger = Logger.getLogger ( LoggerTest.class ) ;
public static void main(String[] args) {
logger.debug("Debug ...");
logger.info("Info ...");
logger.warn("Warn ...");
logger.error("Error ...");
}
}
log4j.properties為什麼無需在web.xml等配置檔案中引入?
其他地方並沒有配置讀取log4j配置檔案,但程式執行後log4j配置檔案會自動起作用。下圖展示的是apache.log4j.java
可以看出在Logger中通過LogManager獲取Logger物件,LogManager.java程式碼如下:
上圖紅色框中顯示LogManager的靜態程式碼塊中會先查詢程式中有沒有override相關功能,如果沒有就查詢log4j.xml,如果還沒有就查詢log4j.properties檔案,即當我們引用了org.apache.log4j,配置好log4j.xml或者log4j.properties後,可以不用在配置檔案中或者程式中再顯示地讀取log4j的配置檔案,在jvm載入LogManager.class時候會執行靜態程式碼塊中的查詢程式碼。
圖2中Loader.getResource()程式碼如下: