1. 程式人生 > >slf4j+log4j與spring整合及相關配置使用

slf4j+log4j與spring整合及相關配置使用

slf4j不是一個真正的日誌實現,而是一個抽象層。允許使用任何一個日誌類庫,並使程式碼獨立於任意一個特定的日誌API。

1.maven pom.xml 引入log4j及slf4j相關包

<!-- LOGGING begin -->
        <dependency>  
              <groupId>log4j</groupId>  
              <artifactId>log4j</artifactId>  
              <version>${log4j.version}</version
>
</dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId
>
org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <!-- common-logging 實際呼叫slf4j --> <dependency> <groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> <!-- java.util.logging 實際呼叫slf4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> <!-- LOGGING end -->

1)spring 內部預設使用的日誌框架是: commons-logging,引入“jcl-over-slf4j”依賴,使spring對common-logging的呼叫轉為對slf4j的呼叫。
2) jul 指的是java.util.logging,專案中採用的一些開源元件可能直接採用了jul 進行日誌輸出,為保證日誌的統一配置管理,需將其遷移到slf4j 日誌框架上,使用“jul-to-slf4j”依賴。

2.在專案的web.xml配置檔案中新增載入log4j的配置

<!-- log4j配置檔案位置 -->
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</param-value>
</context-param>

<!-- 利用spring來使用log4j -->
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

此步驟可以不配置,因為log4j會自動掃描resources目錄下的log4j.xml或log4j.properties.只要配置檔案放在此目錄下即可。

3.在專案類路徑下新增log4j.properties配置檔案

# 日誌輸出級別(INFO)和輸出位置(Console,DailyFile)
log4j.rootLogger=INFO,Console,DailyFile

# 日誌輸出位置為控制檯
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n

# 日誌輸出位置為檔案
#DailyFile
log4j.appender.DailyFile=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.DailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.DailyFile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.appender.DailyFile.Threshold=DEBUG  ## 輸出DEBUG級別以上的日誌
log4j.appender.DailyFile.ImmediateFlush=TRUE ##ImmediateFlush=true,一旦有新日誌寫入,立馬將日誌寫入到磁碟的檔案中
log4j.appender.DailyFile.Append=TRUE ##日誌結果追加
log4j.appender.DailyFile.File=../logs/DBRMS/dbrms.log
log4j.appender.DailyFile.DatePattern='.'yyyy-MM-dd'.log'

#error#
log4j.appender.ErrorFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.ErrorFile.File = ../logs/error/error.log
log4j.appender.ErrorFile.Append = TRUE
log4j.appender.ErrorFile.ImmediateFlush=TRUE
log4j.appender.ErrorFile.Threshold = ERROR
log4j.appender.ErrorFile.layout = org.apache.log4j.PatternLayout
log4j.appender.ErrorFile.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t] %-5p [%c] - %m%n


# 定義相應包路徑下的日誌輸出級別
log4j.logger.com.alibaba=DEBUG
log4j.logger.com.opensymphony.oscache=ERROR
log4j.logger.org.springframework=DEBUG
log4j.logger.com.ibatis.db=WARN
log4j.logger.org.apache.velocity=FATAL

log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
log4j.logger.org.hibernate=DEBUG
log4j.logger.org.logicalcobwebs=WARN

說明:

1)log4j.rootLogger=INFO,Console,DailyFile
此句為將等級為INFO的日誌資訊輸出到Console和DailyFile這兩個目的地,Console和DailyFile的定義在下面的程式碼,可以任意起名。等級可分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF則不打出任何資訊,如果配置為INFO這樣只顯示INFO, WARN, ERROR的log資訊,而DEBUG資訊不會被顯示,具體講解可參照第三部分定義配置檔案中的logger。

2)log4j.appender.Console=org.apache.log4j.ConsoleAppender
此句為定義名為Console的輸出端是哪種型別,可以是org.apache.log4j.ConsoleAppender(控制檯),org.apache.log4j.FileAppender(檔案),org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案),org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案)org.apache.log4j.WriterAppender(將日誌資訊以流格式傳送到任意指定的地方)

3)log4j.appender.Console.layout=org.apache.log4j.PatternLayout
此句為定義名為Console的輸出端的layout是哪種型別,可以是org.apache.log4j.HTMLLayout(以HTML表格形式佈局),org.apache.log4j.PatternLayout(可以靈活地指定佈局模式),org.apache.log4j.SimpleLayout(包含日誌資訊的級別和資訊字串),org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等等資訊)

4)log4j.appender.stdout.Console.ConversionPattern= [QC] %d %-5p [%t] %C.%M(%L) | %m%n
如果使用pattern佈局就要指定的列印資訊的具體格式ConversionPattern,列印引數如下:
%m 輸出程式碼中指定的訊息;
%M 輸出列印該條日誌的方法名;
%p 輸出優先順序,即DEBUG,INFO,WARN,ERROR,FATAL;%-5p是為了輸出對齊。
%r 輸出自應用啟動到輸出該log資訊耗費的毫秒數;
%c 輸出所屬的類目,通常就是所在類的全名;%c{5}制定類的全名層數,最多5層。
%t 輸出產生該日誌事件的執行緒名;
%n 輸出一個回車換行符,Windows平臺為”rn”,Unix平臺為”n”;
%d 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},輸出類似:2002-10-18 22:10:28,921;
[QC]是log資訊的開頭,可以為任意字元,一般為專案簡稱。
輸出示例[TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean ‘MyAutoProxy’

5)定義對應包下的日誌輸出級別
若想在日誌中打出sql,在和mybatis整合的情況下,只需要將需要打出sql的dao層,設定日誌輸出級別為DEBUG即可。
若想精確到方法,則在配置時,寫到方法一級即可
eg:

log4j.logger.com.thinkgem.jeesite.modules.partyManage.dao=DEBUG
log4j.logger.com.thinkgem.jeesite.modules.partyManage.dao.SPmPartyMenberInformationDao.get=DEBUG

第一句存在時,第二句沒嘛用,因為第一句包含第二句了,在一個包下。單第一句沒有的時候,第二句就起效了,此時就第二句的方法列印。

4.自定義列印日誌內容
在類中引入日誌物件:

protected Logger logger = LoggerFactory.getLogger(getClass());

在要列印日誌的地方使用:

//debug可換成info error warn 等級別
logger.debug(“列印內容”);

列印內容–如果想列印異常資訊,在SLF4J 1.6.0以後的版本下可直接列印,如:

logger.error("FinancingManualFacadeImpl.addFinancingProduct failed! {}", e); //{}是佔位符