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中的效果是一樣的。如圖: