1. 程式人生 > >JAVA學習筆記_利用slf4j進行log4j日誌管理

JAVA學習筆記_利用slf4j進行log4j日誌管理

slf4j介紹
slf4j官網:http://www.slf4j.org/
SLF4J,即簡單日誌門面(Simple Logging Facade for Java),不是具體的日誌解決方案,它只服務於各種各樣的日誌系統。SLF4J所提供的核心API是一些介面以及一個LoggerFactory的工廠類。
log4j是一個日誌系統。

slf4j其實用到了一種設計模式(Facade設計模式,門面設計模式)。如下圖:
這裡寫圖片描述

舉例:原先專案使用slf4j統一管理使用log4j而現在改使用logback
步驟:
1、刪除log4j-1.2.12.jar、slf4j-log4j12-1.7.5.jar
2、刪除配置檔案log4j.properties
3、匯入jar包:log4j-over-slf4j-1.7.5.jar、logback-access-1.0.13.jar、logback-classic-1.0.13.jar、logback-core-1.0.13.jar
4、增加logback-1.0.13配置檔案logback.xml
不需要修改專案之前的程式碼,只要更換jar包和相應日誌的配置檔案即可

在應用程式中新增日誌記錄目的:

a.監視程式碼中變數的變化情況,週期性的記錄到檔案中供其他應用進行統計分析工作;
b.跟蹤程式碼執行時軌跡,作為日後審計的依據;
c.擔當整合開發環境中的偵錯程式的作用,向檔案或控制檯列印程式碼的除錯資訊。

最普通的做法就是在程式碼中嵌入許多的列印語句,這些列印語句可以輸出到控制檯或檔案中,比較好的做法就是構造一個日誌操作類來封裝此類操作,而不是讓一系列的列印語句充斥了程式碼的主體。

Log4j簡介
官網:http://logging.apache.org/log4j/2.x/index.html
通過使用Log4j,我們可以控制日誌資訊輸送的目的地是控制檯、檔案、GUI元件、甚至是套介面伺服器、NT的事件記錄器、UNIX Syslog守護程序等;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌資訊的級別,我們能夠更加細緻地控制日誌的生成過程。

Log4j 的目標是:它允許開發人員以任意的精細程度控制哪些日誌說明被輸出。通過使用 外部的配置檔案,可以在執行時配置它。

1)日誌級別
日誌級別從高到低分為:
A:off 最高等級,用於關閉所有日誌記錄。
B:fatal 指出每個嚴重的錯誤事件將會導致應用程式的退出。
C:error 指出雖然發生錯誤事件,但仍然不影響系統的繼續執行。
D:warn 表明會出現潛在的錯誤情形。
E:info 一般和在粗粒度級別上,強調應用程式的執行全程。
F:debug 一般用於細粒度級別上,對除錯應用程式非常有幫助。
G:all 最低等級,用於開啟所有日誌記錄。

2)Log4j組成:
Log4j中有三個主要的元件,它們分別是:Logger、Appender、Layout

Logger:Log4j 允許開發人員定義多個Logger,每個Logger擁有自己的名字,Logger之間通過名字來表明隸屬關係。有一個Logger稱為Root,它永遠存在,且不能通過名字檢索或引用,可以通過Logger.getRootLogger()方法獲得,其它Logger通過 Logger.getLogger(String name)方法。(這是我們最常用的方法)

Appender:Appender則是用來指明將所有的log資訊存放到什麼地方,Log4j中支援多種appender,如 console、files、GUI components、NT Event Loggers等,一個Logger可以擁有多個Appender,也就是你既可以將Log資訊輸出到螢幕,同時儲存到一個檔案中。

Layout:Layout的作用是控制Log資訊的輸出方式,也就是格式化輸出的資訊。

Log4j的配置檔案:
Log4j可以通過Java程式動態設定,該方式明顯缺點是:如果需要修改日誌輸出級別等資訊,則必須修改java檔案,然後重新編譯
Log4j 支援兩種配置檔案格式,一種是 XML 格式的檔案,一種是 Java 特性檔案 lg4j.properties (鍵 = 值),properties檔案簡單易讀,xml檔案可以配置更多的功能(比如過濾)

專案中運用:
引入jar包
這裡寫圖片描述

匯入log4j.properties配置檔案

### 設定###
log4j.rootLogger = debug,stdout,D,E

### 輸出資訊到控制擡 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 輸出DEBUG 級別以上的日誌到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 輸出ERROR 級別以上的日誌到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]

java

public class DBUtilTest {

    @Test
    public  void test(){
        Logger logger = LoggerFactory.getLogger(DBUtilTest.class);
        DBUtil.getCon();

            logger.debug("在{}登入",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));   
            logger.info("info....");    
            logger.error("error....");      
            logger.warn("warn....");        
    }
}

後臺列印效果:
這裡寫圖片描述

log4j.properties

log4j.rootLogger=DEBUG, Console  
#Console  
log4j.appender.Console=org.apache.log4j.ConsoleAppender  
log4j.appender.Console.layout=org.apache.log4j.PatternLayout  
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n  
log4j.logger.java.sql.ResultSet=INFO  
log4j.logger.org.apache=INFO  
log4j.logger.java.sql.Connection=DEBUG  
log4j.logger.java.sql.Statement=DEBUG  
log4j.logger.java.sql.PreparedStatement=DEBUG