情形
複習尚學堂mubatis
一、log4J
1.由apache推出的開源免費日誌處理的類庫
2.爲什麼需要日誌:
2.1 在項目編寫中我們會通過sout來輸出到控制檯debug,但是當項目發佈到tomcat上時,由於是linux服務器,即使有控制檯,但是查看結果不容易,不容易找出錯誤和debug
2.2 log4J的作用,不僅僅能把內容輸出到控制檯,還能把內容輸出到文件中,例如我們的tomcat服務器的log文件夾下的日誌文件,便於觀察結果
3.使用步驟
3.1 導入log4j-xxx.jar
3.2 必須在src目錄下新建log4j.properties(路徑和名稱都不允許改變)
4.log4j輸出級別
4.1 fatal(致命錯誤) > error (錯誤) > warn (警告) > info(普通信息) > debug(調試信息)
4.2 在 log4j.properties 的第一行中控制輸出級別:如下設置爲ERROR,同時需要注意如果我們設置輸出級別爲ERROR,則>=error級別的錯誤纔會輸出。<error的錯誤不會輸出。
5. log4j 輸出目的地
5.1 在一行控制輸出目的地:表示將信息輸出到控制檯(console)以及輸出到日誌文件(logfile),並且
6. pattern 中常用幾個表達式
詳細表達式:https://blog.csdn.net/hello_word2/article/details/79295344
- %C 包名+類名
- %d {YYYY-MM-dd HH:mm:ss} 時間
- %L 行號
- %m 信息
- %n 換行
7.log4j.properties文件配置總體
# 設置輸出級別和將信息輸出到哪裏
log4j.rootCategory=INFO, CONSOLE, LOGFILE
# 負責向控制檯輸出所使用的類
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
# 向控制檯輸出的內容格式,由下列類來控制
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
# 向控制檯輸出的具體內容,可以用log4j表達式來表示我們要輸出的內容是什麼,詳細可參考文檔
log4j.appender.CONSOLE.layout.ConversionPattern=%c %d{YYYY/MM/dd hh:mm:ss} %F %m %n
# 負責向日志文件輸出所使用的類
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
# 向具體哪個目錄下的日誌文件進行輸出,如果寫相對路徑,則在當前項目文件目錄下輸出,輸出位置與src目錄同級
# 如果寫絕對路徑,linux系統則會在根目錄下創建文件夾和文件,如果windows系統,則會根據當前項目在哪個磁盤分區
# 並在該磁盤分區下創建文件夾和文件。例如如下/log/axis.log表示在windows系統下創建文件,位置爲F:/log/axis.log
log4j.appender.LOGFILE.File=/logs/axis.log
# 向日志文件輸出的IO是追加還是非追加,肯定設置爲可追加
log4j.appender.LOGFILE.Append=true
# 向日志文件輸出的內容格式,由下列類來控制
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
# 向日志文件輸出的具體內容,可以用log4j表達式來表示我們要輸出的內容是什麼,詳細可參考文檔
log4j.appender.LOGFILE.layout.ConversionPattern=%C %L %m %n
四、mybatis集成log4j
1.步驟
- 導入log4j的jar包:
- 將log4j.properties文件放到src目錄下:
- 在mybatis.xml配置文件中添加settings標籤,表示mybatis使用log4j,注意settings標籤要放在environment標籤之前,具體標籤的順序可查看官方文檔:
-
<settings> <!--設置我們輸出到日誌文件中的信息的前綴字符串,方便在各種程序啓動日誌中找到相關sql的信息的日誌,便於定位 PS:關於settings標籤中的logPrefix會和log4j.properties文件中的"log4j.logger.cn.uestc.mapper=DEBUG", 也就是局部日誌信息輸出級別進行衝突。如果我們配置了logPrefix的同時也設置了局部日誌信息的輸出級別 控制檯和日誌文件則不會有任何日誌的輸入 這是因爲logPrefix所控制的日誌輸出爲調用sql程序的相關日誌,而"log4j.logger.cn.uestc.mapper=DEBUG" 正好也是控制sql程序的相關日誌。兩者功能都是篩選,所以兩者衝突,導致日誌文件和控制檯沒有信息。 如果我們將log4j.properties中“log4j.logger.cn.uestc.mapper=DEBUG”刪除,則日誌文件和控制檯中會輸出所有 debug級別的日誌信息。同時關於sql的日誌會在前面加上“關於sql的相關日誌”,而如果我們在這裏將logPrefix 註釋掉,則日誌文件信息和控制檯只會輸出關於sql的日誌信息,而其他信息可以通過設置全局級別設置成ERROR而過濾 掉其他信息的debug信息--> <!--<setting name="logPrefix" value="關於sql的相關日誌:"/>--> <setting name="logImpl" value="LOG4J"/> </settings>
-
log4j.properties文件配置
-
# 設置所有日誌信息的輸出級別、將信息輸出到哪裏 log4j.rootCategory=ERROR, CONSOLE, LOGFILE #設置局部或者指定日誌信息的輸出級別 log4j.logger.cn.uestc.mapper=DEBUG # 負責向控制檯輸出所使用的類 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender # 向控制檯輸出的內容格式,由下列類來控制 log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout # 向控制檯輸出的具體內容,可以用log4j表達式來表示我們要輸出的內容是什麼,詳細可參考文檔 log4j.appender.CONSOLE.layout.ConversionPattern=%c %p %d{YYYY/MM/dd hh:mm:ss} %F %m %n # 負責向日志文件輸出所使用的類 log4j.appender.LOGFILE=org.apache.log4j.FileAppender # 向具體哪個目錄下的日誌文件進行輸出,如果寫相對路徑,則在當前項目文件目錄下輸出,輸出位置與src目錄同級 # 如果寫絕對路徑,linux系統則會在根目錄下創建文件夾和文件,如果windows系統,則會根據當前項目在哪個磁盤分區 # 並在該磁盤分區下創建文件夾和文件。例如如下/log/mybatis/sql.log表示在windows系統下創建文件,位置爲F:/logs/mybatis/sql.log log4j.appender.LOGFILE.File=/logs/mybatis/sql.log # 向日志文件輸出的IO是追加還是非追加,肯定設置爲可追加 log4j.appender.LOGFILE.Append=true # 向日志文件輸出的內容格式,由下列類來控制 log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout # 向日志文件輸出的具體內容,可以用log4j表達式來表示我們要輸出的內容是什麼,詳細可參考文檔 log4j.appender.LOGFILE.layout.ConversionPattern=%C %L %m %n
2.測試
(1)測試類:
package cn.uestc.test;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestLog4jUse4mybatis {
public static void main(String[] args) throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
List<Object> list = sqlSession.selectList("cn.uestc.mapper.PeopleMapper.selAll");
sqlSession.close();
}
}
(2)結果:
控制檯:
日誌文件:
(3)debug
情形:
在log4j.properties文件中設置了局部或者指定日誌信息的輸出級別,並在mybatis.xml文件中配置了logPrefix屬性,導致日誌文件和控制檯沒有輸出日誌結果,這是因爲log4j.properties中的“log4j.logger.cn.uestc.mapper=DEBUG”與mybatis.xml中的“<setting name="logPrefix" value="關於sql的相關日誌:"/>”衝突,兩者的作用都是對日誌信息進行過濾和篩選。log4j.properties的篩選範圍更大,可以指定方法,類或者包下的所有類都進行日誌輸出。而logPrefix不會過濾日誌信息,但是他會在關於sql調用的日誌信息前加上“關於sql的相關日誌:”的字符串,方便查找。
復現
bug復現:上述兩個過濾條件都不註釋,控制檯和日誌文件沒有任何輸出信息
去掉任何一個過濾條件:這裏我們註釋掉log4j.properties的過濾信息,因爲在2.測試中將logPrefix註釋掉了,同時將log4j.properties中的全局日誌輸出級別改爲debug,否則程序如果正常不會將日誌輸出到控制檯或者日誌文件
(4)總結
從精準定位來看,通過log4j.properties文件來配置過濾信息是比較好的,日誌文件寫入信息少,而且不光可以指定輸出sql的日誌信息,還可以指定到具體方法,具體類,和具體包,接下來是對log4j.properties對日誌級別的控制總結
- 命名級別(包級別): mapper.xml文件中的namespace 屬性中除去最後一個類名
- 如何通過log4j.properties文件來配置過濾信息
- 1. 先在總體級別調成 Error 不輸出無用信息
- 2. 在設置某個指定位置級別爲 DEBUG
- 如圖:
- 如何通過log4j.properties文件來配置過濾信息
- 類級別: namespace 屬性值 ,namespace 類名
- 如圖:則在log4j.properties中將上圖中的log4j.logger.cn.uestc.mapper=DEBUG改爲log4j.logger.cn.uestc.mapper.PeopleMapper=DEBUG
- 方法級別:使用 namespace 屬性值+標籤 id 屬性值
- 如圖:則在log4j.properties中將上圖中的log4j.logger.cn.uestc.mapper=DEBUG改爲log4j.logger.cn.uestc.mapper.PeopleMapper.selAll=DEBUG