《SpringBoot 整合日誌logback slf4j》

日誌管理在任何工程裡面都很重要,Java 體系比較成熟的日誌管理工具有以下幾個。

  • log4j ,Apache的開源項目log4j是一個功能強大的日誌組件,早期開發者都在用的日誌組件。
  • logback,是由log4j 作者重新編寫的一套日誌組件,需要配合slf4j(簡單日誌門面),logback完美實現了slf4j的功能,比log4j好用,性能更好,推薦使用。此處應該有一個,門面模式的介紹。
  • lombok,其實現在比較常用的統一由lombok來管理日誌,其實lombok也是由slf4j,logback來管理日誌的,關於lombok的詳細介紹需要寫一個專題文章

一、基於logback 和 slf4j 來增強springboot 的日誌管理

1、在pom文件中,添加log4j 和 logback, 參考 http://www.slf4j.org/manual.html,為什麼不看logback的官網而看slf4j官網呢?這是學習一個新技術最核心的問題,要理解我們用的是slf4j來做為日誌的管理,slf4j代理了logback的日誌管理的功能,角色是slf4j是個代理人,logback是真正幹活兒的,只不過對外溝通託管給了slf4j,所以要看slf4j。

另外很多其他資料都是在pom中添加三個jar包,其實也不錯,只不過還是簡單,看一看官網就知道了,logback-classic 集成了 logback-core 和 slf4j-api,引入這一個就夠了。這裡總結了一個學習方法,先要搞明白每個角色負責啥,才知道從哪裡入手開始搞。

<code><dependency>   <groupid>ch.qos.logback/<groupid>  <artifactid>logback-classic/<artifactid>  <version>1.2.3/<version>/<dependency>/<code>

2、在Springboot項目中使用logback

<code>package org.example;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/** * Hello world! */@SpringBootApplicationpublic class App {    //實例化一個靜態Logger對象用於在本類中統一處理日誌    private final static Logger logger = LoggerFactory.getLogger(App.class);    public static void main( String[] args ) {        SpringApplication.run(App.class);        logger.info("ddddd");        System.out.println( "Hello World!" );    }}/<code>
  1. 在需要使用日誌的類裡,實例化一個靜態對象Logger ,
  2. 在後續的方法中統一使用logger 來輸出日誌,如logger.info logger.error logger.debug問題來了
  • 我想改變日誌格式 ?
  • 我想把日誌記到文件裡 ?
  • 我想日誌按天切割 ?

3、 -針對上面的問題,配置logback的配置文件,包含日誌切割方案,日誌存放目錄,日誌格式

參考 http://logback.qos.ch/manual/ 坦白說這個官網藏得很深,我找了好久才找到

基礎配置版本

<code><configuration>  <appender>        <encoder>      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/<pattern>    /<encoder>  /<appender>  <root>    <appender-ref>  /<root>/<configuration>/<code>

上面的 appender標籤,root,appender-ref 看的好懵逼,還是要看看官網弄明白都是幹什麼用的,再把官網拋出來

http://logback.qos.ch/manual/

根標籤,簡單理解為,當前工程內所有java 包都採用root 標籤的 日誌級別和關聯的 appender

輸出源,指日誌的輸出源,常用的有如下幾個

  • FileAppender 文件輸出源
  • ConsoleAppender 控制檯輸出源
  • RollingFileAppender 分割文件輸出源

按天分割,輸出到指定文件配置參考官網如下

<code><configuration>  <appender>    <file>logs/logFile.log/<file>    <rollingpolicy>            <filenamepattern>logFile.%d{yyyy-MM-dd}.log/<filenamepattern>            <maxhistory>30/<maxhistory>      <totalsizecap>3GB/<totalsizecap>    /<rollingpolicy>    <encoder>      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n/<pattern>    /<encoder>  /<appender>   <root>    <appender-ref>  /<root>/<configuration>/<code>

appender 中的pattern 就是用來管理日誌格式的,參考官網會看到對應的解釋

<code><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/<pattern>/<code>

現在我們確定了logback的日誌配置文件,這個配置文件怎麼用呢?放在哪裡?

所有問題都要去看官網,當然也可以搜索Baidu 或者 google ,但是我認為那是解決問題的方式,不是學習方式,學習是要自己能夠去主動找到方法,並實踐成功。


《SpringBoot 整合日誌logback slf4j》

我們得出一個結論,logback 會在classpath 目錄找 logback-test.xml 如果沒有 logback.groovy ,如何還沒有找 logback.xml

這裡推薦使用logback.xml,放在工程目錄的 resource文件下,其實resource文件只是一個特殊文件夾,放一些資源文件,能夠讓java 掃描到,核心為啥會掃描到,還是因為要把resource文件夾放在 classpath 裡面。此處應該有個Java classpath的介紹。

啟動Springboot,我們可以看到日誌都輸出到程序運行根目錄下的logs文件夾下

問題又來了?我們想把一個特定的類或者包下的日誌單獨輸出到另一個地方怎麼做的?

還是看官網

增加 標籤,用以指定特定的包的日誌處理規範,包含日誌級別和 appender, 參考官網配置

<code><configuration>  <appender>        <encoder>      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/<pattern>    /<encoder>  /<appender>  <logger>      <root>              <appender-ref>  /<root>    /<configuration>/<code>

至此,我們成功的為springboot 增強了日誌管理,其實該方法同樣適用於普通Java 工程。

二、基於lombok 來增強springboot的日誌管理

加入lombok 的pom引用,Idea 需要增加lombok 的插件否則編輯代碼的時候不會有提示

加入如下代碼

<code><dependency>      <groupid>org.projectlombok/<groupid>      <artifactid>lombok/<artifactid>      <version>1.18.10/<version>      <scope>provided/<scope>    /<dependency>/<code>

採用lombok 插件+ @Slf4j 註解來簡化Java 代碼

<code>import lombok.extern.slf4j.Slf4j;/** * AiworksApplication * * @author yubangxu */@Slf4jpublic class AiworksApplication {    public static void main( String[] args ) {        log.info("hello world!");        System.out.println( "Hello World!" );    }}/<code>


關於lombok的其他用法,再後續的文章中會寫到,同時會在下方增加一個鏈接


分享到:


相關文章: