1. 程式人生 > >logback日誌元件應用和logback.xml詳解(springmvc和springboot)

logback日誌元件應用和logback.xml詳解(springmvc和springboot)

本章將通過logback的配置檔案和4個javabean為例項,來講解和驗證logback的使用方式。

最後分別生成debug、info、error類別,以及4個javabean分別生成一個日誌檔案。

如圖:


一、簡介

Logback是由log4j創始人設計的又一個開源日誌元件。Logback為取代log4j而生。Logback官方網站:http://logback.qos.ch。

logback當前分成三個模組:logback-core,logback-classic和logback-access。

logback-core是其它兩個模組的基礎模組。logback-classic是log4j的一個改良版本。

此外logback-classic完整實現SLF4J API使你可以很方便地更換成其它日誌系統如log4j或JDK14 Logging。

logback-access訪問模組與Servlet容器整合提供通過Http來訪問日誌的功能。

二、與log4j的比較

1.更快的實現:Logback的核心重寫了,在一些關鍵執行路徑上效能提升10倍以上。而且logback不僅效能提升了,初始化記憶體載入也更小了。

2.非常充分的測試:Logback經過了幾年,數不清小時的測試。Logback的測試完全不同級別的。

3.非常充分的文件

4.自動重新載入配置檔案,當配置檔案修改了,Logback-classic能自動重新載入配置檔案。掃描過程快且安全,它並不需要另外建立一個掃描執行緒。

5.自動去除舊的日誌檔案:通過設定TimeBasedRollingPolicy或者SizeAndTimeBasedFNATP的maxHistory屬性,你可以控制已經產生日誌檔案的最大數量。如果設定maxHistory 12,那那些log檔案超過12個月的都會被自動移除。

等...

三、配置maven依賴包

log4j的配置,這裡不再贅述。

Logback配置檔案為:logback.xml,一般放在工程的resources包下。

maven依賴包:


四、準備程式 先拋開logback的配置檔案,先用4個javabean來分別打印出日誌資訊。如圖:
然後在TestA、B、C、D四個javabean中,分別打印出debug、info、warn、error資訊。

這樣呼叫A、B、C、D四個javabean,都會分別輸出以上日誌資訊。

最後寫一個main方法來呼叫並測試。


最後,通過logback.xml配置後,會打印出如下圖的日誌檔案:


通過這樣的方式,就能在系統中分模組、分功能的輸出自己想要的日誌資訊,便於管理,然後再讓我們看下logback.xml的配置檔案。

先賣一個關子,我們先看看一下日誌檔案:TESTLOG_all_info.log.2017-07-18.log


為什麼會出現B只打印了info、warn、error日誌。C只打印了warn和error日誌,而D只打印了error的日誌呢?

而四個javabeanA、B、C、D分別生成的日誌呢?如圖:





這個我們在logback.xml中講解

五、logback.xml配置檔案 

<?xml version="1.0" encoding="UTF-8" ?>

truesystem-log-info: %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{100} - %msg%n trueINFO./log/TESTLOG_all_info.log./log/TESTLOG_all_info.log.%d{yyyy-MM-dd}.log30%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n20MBINFO./log/TESTLOG_all_test_info.log./log/TESTLOG_all_test_info.%d{yyyy-MM-dd}.%i.log155MB%date [%thread] %-5level %logger - %msg%nERRORACCEPTDENY./log/TESTLOG_all_error.log./log/TESTLOG_all_error.%d{yyyy-MM-dd}.%i.log155MB%date [%thread] %-5level %logger - %msg%nDEBUG./log/TESTLOG_all_debug.log./log/TESTLOG_all_debug.%d{yyyy-MM-dd}.%i.log155MB%date [%thread] %-5level %logger{80} - %msg%n./log/TESTLOG_a_debug.log./log/TESTLOG_a_debug.%d{yyyy-MM-dd}.%i.log155MB%date [%thread] %-5level %logger{80} - %msg%n./log/TESTLOG_b_info.log./log/TESTLOG_b_info.%d{yyyy-MM-dd}.%i.log155MB%date [%thread] %-5level %logger{80} - %msg%n./log/TESTLOG_c_warn.log./log/TESTLOG_c_warn.%d{yyyy-MM-dd}.%i.log155MB%date [%thread] %-5level %logger{80} - %msg%n./log/TESTLOG_d_error.log./log/TESTLOG_d_error.%d{yyyy-MM-dd}.%i.log155MB%date [%thread] %-5level %logger{80} - %msg%n

六、解釋

為什麼TESTLOG_all_info.log.2017-07-18.log的日誌會是如上圖那樣:

因為在配置檔案中A的日誌級別是:debug;B的日誌級別是:info;C的日誌級別是:warn;D的日誌級別是:error。

所以才會出現TESTLOG_all_info.log.2017-07-18.log那樣的情況。

同理四個javabeanA、B、C、D分別生成的日誌也是按照這個級別來顯示輸入的。如圖:


其他的logback配置資訊,在logback.xml中已經註釋的非常清楚了。不必贅述。

另外:在spirngboot中,springboot已經集成了logback,如何通過application-*.properties直接配置logback,待研究。如:

logging.file=D:/logback/xxboot.log
logging.level.org.springframework.web=DEBUG

七、springboot中使用logback

對於簡單的logback配置,在springboot的屬性檔案中就可以進行配置,但是對於比較複雜的輸出情況,還是用logback.xml來進行配置稍好點。

對於昨天在spirngmvc中對加入logback進行測試後,筆者隨後又在springboot中對以上配置檔案進行了驗證,發現上面的logback.xml配置在springboot中依然奏效。


程式碼如下:

//A-debug-log
@RestController
public class AlogController {

    private final Logger log = LoggerFactory.getLogger(AlogController.class);

    @RequestMapping("/Alog")
    public void Alog(){
        log.debug("test=====A=====debug-log");
        log.info("test=====A=====info-log");
        log.warn("test=====A=====warn-log");
        log.error("test=====A=====errro-log");
    }
}

//B-info-log
@RestController
public class BlogController {

    private final Logger log = LoggerFactory.getLogger(BlogController.class);

    @RequestMapping("/Blog")
    public void Blog(){
        log.debug("test=====B=====debug-log");
        log.info("test=====B=====info-log");
        log.warn("test=====B=====warn-log");
        log.error("test=====B=====errro-log");
    }
}

//C-warn-log
@RestController
public class ClogController {
    private final Logger log = LoggerFactory.getLogger(ClogController.class);

    @RequestMapping("/Clog")
    public void Clog(){
        log.debug("test=====C=====debug-log");
        log.info("test=====C=====info-log");
        log.warn("test=====C=====warn-log");
        log.error("test=====C=====errro-log");
    }
}

//D-error-log
@RestController
public class DlogController {
    private final Logger log = LoggerFactory.getLogger(DlogController.class);

    @RequestMapping("/Dlog")
    public void Dlog(){
        log.debug("test=====D=====debug-log");
        log.info("test=====D=====info-log");
        log.warn("test=====D=====warn-log");
        log.error("test=====D=====errro-log");
    }
}
其列印輸出的效果是和springmvc中的效果是一樣的。如圖: