<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Spring Boot 使用slf4j進(jìn)行日志記錄

          共 6945字,需瀏覽 14分鐘

           ·

          2021-02-02 05:18

          本來已收錄到我寫的10萬字Springboot經(jīng)典學(xué)習(xí)筆記中,筆記在持續(xù)更新……文末有領(lǐng)取方式

          在開發(fā)中,我們經(jīng)常使用 System.out.println() 來打印一些信息,但是這樣不好,因?yàn)榇罅康氖褂?System.out 會(huì)增加資源的消耗。我們實(shí)際項(xiàng)目中使用的是 slf4j 的 logback 來輸出日志,效率挺高的,Spring Boot 提供了一套日志系統(tǒng),logback 是最優(yōu)的選擇。

          1. slf4j 介紹

          引用百度百科里的一段話:

          SLF4J,即簡單日志門面(Simple Logging Facade for Java),不是具體的日志解決方案,它只服務(wù)于各種各樣的日志系統(tǒng)。按照官方的說法,SLF4J是一個(gè)用于日志系統(tǒng)的簡單Facade,允許最終用戶在部署其應(yīng)用時(shí)使用其所希望的日志系統(tǒng)。

          這段的大概意思是:你只需要按統(tǒng)一的方式寫記錄日志的代碼,而無需關(guān)心日志是通過哪個(gè)日志系統(tǒng),以什么風(fēng)格輸出的。因?yàn)樗鼈內(nèi)Q于部署項(xiàng)目時(shí)綁定的日志系統(tǒng)。例如,在項(xiàng)目中使用了 slf4j 記錄日志,并且綁定了 log4j(即導(dǎo)入相應(yīng)的依賴),則日志會(huì)以 log4j 的風(fēng)格輸出;后期需要改為以 logback 的風(fēng)格輸出日志,只需要將 log4j 替換成 logback 即可,不用修改項(xiàng)目中的代碼。這對(duì)于第三方組件的引入的不同日志系統(tǒng)來說幾乎零學(xué)習(xí)成本,況且它的優(yōu)點(diǎn)不僅僅這一個(gè)而已,還有簡潔的占位符的使用和日志級(jí)別的判斷。

          正因?yàn)?sfl4j 有如此多的優(yōu)點(diǎn),阿里巴巴已經(jīng)將 slf4j 作為他們的日志框架了。在《阿里巴巴Java開發(fā)手冊(cè)(正式版)》中,日志規(guī)約一項(xiàng)第一條就強(qiáng)制要求使用 slf4j:

          1.【強(qiáng)制】應(yīng)用中不可直接使用日志系統(tǒng)(Log4j、Logback)中的API,而應(yīng)依賴使用日志框架SLF4J中的API,使用門面模式的日志框架,有利于維護(hù)和各個(gè)類的日志處理方式統(tǒng)一。

          “強(qiáng)制”兩個(gè)字體現(xiàn)出了 slf4j 的優(yōu)勢(shì),所以建議在實(shí)際項(xiàng)目中,使用 slf4j 作為自己的日志框架。使用 slf4j 記錄日志非常簡單,直接使用  LoggerFactory 創(chuàng)建即可。

          import org.slf4j.Logger;
          import org.slf4j.LoggerFactory;

          public class Test {
              private static final Logger logger = LoggerFactory.getLogger(Test.class);
              // ……
          }

          2. application.yml 中對(duì)日志的配置

          Spring Boot 對(duì) slf4j 支持的很好,內(nèi)部已經(jīng)集成了 slf4j,一般我們?cè)谑褂玫臅r(shí)候,會(huì)對(duì)slf4j 做一下配置。application.yml 文件是 Spring Boot 中唯一一個(gè)需要配置的文件,一開始創(chuàng)建工程的時(shí)候是 application.properties 文件,個(gè)人比較細(xì)化用 yml 文件,因?yàn)?yml 文件的層次感特別好,看起來更直觀,但是 yml 文件對(duì)格式要求比較高,比如英文冒號(hào)后面必須要有個(gè)空格,否則項(xiàng)目估計(jì)無法啟動(dòng),而且也不報(bào)錯(cuò)。用 properties 還是 yml 視個(gè)人習(xí)慣而定,都可以。本課程使用 yml。

          我們看一下 application.yml 文件中對(duì)日志的配置:

          logging:
            config: logback.xml
            level:
              com.itcodai.course03.dao: trace

          logging.config 是用來指定項(xiàng)目啟動(dòng)的時(shí)候,讀取哪個(gè)配置文件,這里指定的是日志配置文件是根路徑下的 logback.xml 文件,關(guān)于日志的相關(guān)配置信息,都放在 logback.xml 文件中了。logging.level 是用來指定具體的 mapper 中日志的輸出級(jí)別,上面的配置表示 com.itcodai.course03.dao 包下的所有 mapper 日志輸出級(jí)別為 trace,會(huì)將操作數(shù)據(jù)庫的 sql 打印出來,開發(fā)時(shí)設(shè)置成 trace 方便定位問題,在生產(chǎn)環(huán)境上,將這個(gè)日志級(jí)別再設(shè)置成 error 級(jí)別即可(本節(jié)課不討論 mapper 層,在后面 Spring Boot 集成 MyBatis 時(shí)再詳細(xì)討論)。

          常用的日志級(jí)別按照從高到低依次為:ERROR、WARN、INFO、DEBUG。

          3. logback.xml 配置文件解析

          在上面 application.yml 文件中,我們指定了日志配置文件 logback.xmllogback.xml 文件中主要用來做日志的相關(guān)配置。在 logback.xml 中,我們可以定義日志輸出的格式、路徑、控制臺(tái)輸出格式、文件大小、保存時(shí)長等等。下面來分析一下:

          3.1 定義日志輸出格式和存儲(chǔ)路徑

          <configuration>
           <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
           <property name="FILE_PATH" value="D:/logs/course03/demo.%d{yyyy-MM-dd}.%i.log" />
          configuration>

          我們來看一下這個(gè)定義的含義:首先定義一個(gè)格式,命名為 “LOG_PATTERN”,該格式中 %date 表示日期,%thread 表示線程名,%-5level 表示級(jí)別從左顯示5個(gè)字符寬度,%logger{36}  表示 logger 名字最長36個(gè)字符,%msg 表示日志消息,%n 是換行符。

          然后再定義一下名為 “FILE_PATH” 文件路徑,日志都會(huì)存儲(chǔ)在該路徑下。%i 表示第 i 個(gè)文件,當(dāng)日志文件達(dá)到指定大小時(shí),會(huì)將日志生成到新的文件里,這里的 i 就是文件索引,日志文件允許的大小可以設(shè)置,下面會(huì)講解。這里需要注意的是,不管是 windows 系統(tǒng)還是 Linux 系統(tǒng),日志存儲(chǔ)的路徑必須要是絕對(duì)路徑。

          3.2 定義控制臺(tái)輸出

          <configuration>
           <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                      
             <pattern>${LOG_PATTERN}pattern>
            encoder>
           appender>
          configuration>

          使用 節(jié)點(diǎn)設(shè)置個(gè)控制臺(tái)輸出(class="ch.qos.logback.core.ConsoleAppender")的配置,定義為 “CONSOLE”。使用上面定義好的輸出格式(LOG_PATTERN)來輸出,使用 ${} 引用進(jìn)來即可。

          3.3 定義日志文件的相關(guān)參數(shù)

          <configuration>
           <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             
             <fileNamePattern>${FILE_PATH}fileNamePattern>
             
             <maxHistory>15maxHistory>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
              
              <maxFileSize>10MBmaxFileSize>
             timeBasedFileNamingAndTriggeringPolicy>
            rollingPolicy>

            <encoder>
             
             <pattern>${LOG_PATTERN}pattern>
            encoder>
           appender>
          configuration>

          使用 定義一個(gè)名為 “FILE” 的文件配置,主要是配置日志文件保存的時(shí)間、單個(gè)日志文件存儲(chǔ)的大小、以及文件保存的路徑和日志的輸出格式。

          3.4 定義日志輸出級(jí)別

          <configuration>
           <logger name="com.itcodai.course03" level="INFO" />
           <root level="INFO">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="FILE" />
           root>
          configuration>

          有了上面那些定義后,最后我們使用 來定義一下項(xiàng)目中默認(rèn)的日志輸出級(jí)別,這里定義級(jí)別為 INFO,然后針對(duì) INFO 級(jí)別的日志,使用 引用上面定義好的控制臺(tái)日志輸出和日志文件的參數(shù)。這樣 logback.xml 文件中的配置就設(shè)置完了。

          4. 使用Logger在項(xiàng)目中打印日志

          在代碼中,我們一般使用 Logger 對(duì)象來打印出一些 log 信息,可以指定打印出的日志級(jí)別,也支持占位符,很方便。

          import org.slf4j.Logger;
          import org.slf4j.LoggerFactory;
          import org.springframework.web.bind.annotation.RequestMapping;
          import org.springframework.web.bind.annotation.RestController;

          @RestController
          @RequestMapping("/test")
          public class TestController {

              private final static Logger logger = LoggerFactory.getLogger(TestController.class);

              @RequestMapping("/log")
              public String testLog() {
                  logger.debug("=====測(cè)試日志debug級(jí)別打印====");
                  logger.info("======測(cè)試日志info級(jí)別打印=====");
                  logger.error("=====測(cè)試日志error級(jí)別打印====");
                  logger.warn("======測(cè)試日志warn級(jí)別打印=====");

                  // 可以使用占位符打印出一些參數(shù)信息
                  String str1 = "武哥聊編程";
                  String str2 = "blog.csdn.net/eson_15";
                  logger.info("======武哥的公眾號(hào):{};武哥的CSDN博客:{}", str1, str2);

                  return "success";
              }
          }

          啟動(dòng)該項(xiàng)目,在瀏覽器中輸入 localhost:8080/test/log 后可以看到控制臺(tái)的日志記錄:

          1. ======測(cè)試日志info級(jí)別打印=====
          2. =====測(cè)試日志error級(jí)別打印====
          3. ======測(cè)試日志warn級(jí)別打印=====
          4. ======武哥的公眾號(hào):武哥聊編程;武哥的CSDN博客:blog.csdn.net/eson_15

          因?yàn)?INFO 級(jí)別比 DEBUG 級(jí)別高,所以 debug 這條沒有打印出來,如果將 logback.xml 中的日志級(jí)別設(shè)置成 DEBUG,那么四條語句都會(huì)打印出來,這個(gè)大家自己去測(cè)試了。同時(shí)可以打開 D:\logs\course03\ 目錄,里面有剛剛項(xiàng)目啟動(dòng),以后后面生成的所有日志記錄。在項(xiàng)目部署后,我們大部分都是通過查看日志文件來定位問題。

          5. 總結(jié)

          本節(jié)課主要對(duì) slf4j 做了一個(gè)簡單的介紹,并且對(duì) Spring Boot 中如何使用 slf4j 輸出日志做了詳細(xì)的說明,著重分析了 logback.xml 文件中對(duì)日志相關(guān)信息的配置,包括日志的不同級(jí)別。最后針對(duì)這些配置,在代碼中使用 Logger 打印出一些進(jìn)行測(cè)試。在實(shí)際項(xiàng)目中,這些日志都是排查問題的過程中非常重要的資料。


          該文已收錄到我寫的《10萬字Springboot經(jīng)典學(xué)習(xí)筆記》中,歡迎掃描下方二維碼領(lǐng)取全套筆記



          關(guān)注Java開發(fā)寶典

          回復(fù):筆記



          點(diǎn)贊是最大的支持 

          瀏覽 32
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  男人的天堂黄色 | 人人色在线视频播放 | jizz在线免费观看视频 | 一级欧美另类 | 青娱乐自拍极品92 |