日誌——log4J淺談與使用

 

情形

複習尚學堂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
      • 如圖:
  • 類級別: 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章