spring boot(8)默認日誌logback配置

1 日誌簡介

    Spring Boot使用Commons Logging記錄全部內部日誌,可是它將底層日誌實現打開,爲Java.Util.LoggingLog4J2Logback提供默認配置。 在每一個案例中,loggers都預先配置,以使用控制檯輸出,同時還提供可選的文件輸出。html

      默認狀況下,若是你使用「starters」,Logback將會被用於記錄日誌。還包括佔用Logback路由,以確保使用Java Util Logging、Commons logging、Log4J或SLF4J的依賴庫都能正常工做。java

2 默認日誌logback

2.1 logback日誌簡介

      SLF4J——Simple Logging Facade For Java,它是一個針對於各種Java日誌框架的統一Facade抽象。Java日誌框架衆多——經常使用的有java.util.logging, log4j, logbackcommons-logging, Spring框架使用的是Jakarta Commons Logging API (JCL)。而SLF4J定義了統一的日誌抽象接口,而真正的日誌實現則是在運行時決定的——它提供了各種日誌框架的綁定。web

      Logback是log4j框架的做者開發的新一代日誌框架,它效率更高、可以適應諸多的運行環境,同時自然支持SLF4J。spring

      默認狀況下,Spring Boot會用Logback來記錄日誌,並用INFO級別輸出到控制檯。在運行應用程序和其餘例子時,能夠看到不少INFO級別的日誌。sql

      從上圖能夠看到,日誌輸出內容元素具體以下:apache

  • 時間日期:精確到毫秒
  • 日誌級別:ERROR, WARN, INFO, DEBUG or TRACE
  • 進程ID
  • 分隔符:--- 標識實際日誌的開始
  • 線程名:方括號括起來(可能會截斷控制檯輸出)
  • Logger名:一般使用源代碼的類名
  • 日誌內容

      用Logback來記錄日誌,需添加日誌依賴api

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

     實際開發中咱們不須要直接添加該依賴,你會發現spring-boot-starter其中包含了spring-boot-starter-logging,該依賴內容就是 Spring Boot 默認的日誌框架 logback。安全

2.2 application.properties配置中的日誌相關屬性

2.2.1 控制檯輸出  

      日誌級別從低到高分爲TRACE < DEBUG < INFO < WARN < ERROR < FATAL,若是設置爲WARN,則低於WARN的信息都不會輸出。Spring Boot中默認配置ERRORWARNINFO級別的日誌輸出到控制檯。您還能夠經過啓動您的應用程序–debug標誌來啓用「調試」模式(開發的時候推薦開啓),如下兩種方式皆可:oracle

  • 在運行命令後加入--debug標誌,如:$ java -jar springTest.jar --debug
  • application.properties中配置debug=true,該屬性置爲true的時候,核心Loggers(包含嵌入式容器、hibernate、spring)會輸出更多內容,啓用debug模式並不會使用debug級別配置您的應用程序來記錄全部信息。

      或者,您能夠經過在應用程序中使用-trace標誌(或在application.properties中配置trace=true)啓動應用程序來啓用「跟蹤」模式。app

2.2.2 文件輸出

      默認狀況下,Spring Boot將日誌輸出到控制檯,不會寫到日誌文件。若是要編寫除控制檯輸出以外的日誌文件,則需在application.properties中設置logging.file或logging.path屬性。

  • logging.file,設置指定的日誌文件,能夠是絕對路徑,也能夠是相對路徑。如:logging.file=my.log
  • logging.path,設置指定的目錄,會在該目錄下建立spring.log文件,並寫入日誌內容,如:logging.path=/var/log

    默認狀況下,日誌文件的大小達到10MB時會切分一次,產生新的日誌文件,默認級別爲:ERROR、WARN、INFO

     日誌系統在應用程序生命週期的早期被初始化,而且在經過@propertysource註解加載的屬性文件中不會找到這樣的日誌屬性。

   日誌屬性與實際的日誌基礎結構無關。所以,特定的配置鍵(例如logback中的 logback.configurationFile )不是由spring boot管理的。

2.2.3 彩色日誌輸出

      省略...     

2.2.4 日誌級別

       全部支持日誌記錄的系統均可以在Spring環境中設置記錄級別(例如在application.properties中)
格式爲:’logging.level.* = LEVEL’

  • logging.level:日誌級別控制前綴,*爲包名或Logger名
  • LEVEL:選項TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF

       root日誌可使用 logging.level.root 配置,application.properties實例:

logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR

       默認狀況下,Spring boot對 Thymeleaf INFO 消息進行了從新映射,使它們在調試級別上被記錄,這有助於減小標準日誌輸出中的噪聲。有關如何在本身的配置中應用從新映射的詳細信息,請參閱LevelRemappingAppender。

2.2.5 自定義日誌配置

      能夠經過在classpath中包含適當的庫來激活各類日誌系統,並經過在classpath根目錄提供適當的配置進行定製。或者在適當的位置提供spring 環境屬性logging.config。

      還能夠強制spring boot使用特定的日誌系統經過使用 org.springframework.boot.logging.LoggingSystem 系統屬性。 該值應該是一個 LoggingSystem 實現的徹底限定類名。 您還可使用none值徹底禁用Spring boot的日誌記錄配置。

    因爲日誌是在應用程序applicationContext上下文建立以前初始化的,因此不可能在Spring @configuration註解文件中控制來自@propertySource的日誌記錄。系統屬性和常規的Spring boot外部配置文件已經工做得很好。

      根據不一樣的日誌系統,你能夠按以下規則組織配置文件名,就能被正確加載:

  • Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
  • Log4j2:log4j2-spring.xml, log4j2.xml
  • JDK (Java Util Logging):logging.properties

     在可能的狀況下,咱們建議您使用-spring變體來進行日誌配置( 如使用logback-spring.xml而不是logback.xml )。若是使用標準配置logback.xml,Spring沒法徹底控制日誌初始化。 Spring boot包含許多對Logback的擴展,能夠幫助高級配置,您能夠在您的logback-spring.xml文件中使用這些擴展。在標準配置logback.xml中不能使用這些擴展由於它太早被加載,固然若是必定要使用,需定義一個 logging.config 屬性。

注:這些擴展不能與Logback的配置掃描一塊兒使用。若是您嘗試這樣作,對配置文件進行更改將致使相似於如下日誌記錄之一的錯誤:

ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]]
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]

 

3 logback日誌介紹與配置

3.1 logback介紹

    Logback是由log4j創始人設計的又一個開源日誌組件。logback當前分紅三個模塊:logback-core,logback- classic和logback-access。logback-core是其它兩個模塊的基礎模塊。logback-classic是log4j的一個 改良版本。此外logback-classic完整實現SLF4J API使你能夠很方便地更換成其它日誌系統如log4j或JDK14 Logging。logback-access訪問模塊與Servlet容器集成提供經過Http來訪問日誌的功能。 Logback是要與SLF4J結合起來用兩個組件的官方網站以下:

      logback的官方網站: http://logback.qos.ch

      SLF4J的官方網站:http://www.slf4j.org

3.2 logback取代log4j的理由

     Logback和log4j是很是類似的,若是你對log4j很熟悉,那對logback很快就會駕輕就熟。下面列了logback相對於log4j的一些優勢:

  • 更快的實現  Logback的內核重寫,在一些關鍵執行路徑上性能提高10倍以上。並且logback不只性能提高,初始化內存加載也更小。
  • 很是充分的測試  Logback通過了幾年,數不清小時的測試,Logback的測試徹底不一樣級別的。在做者的觀點,這是簡單重要的緣由選擇logback而不是log4j。
  • Logback-classic很是天然實現了SLF4j    由於logback-classic很是天然地實現了SLF4J,  所 以切換到log4j或者其餘,很是容易,只須要提供成另外一個jar包就OK,根本不須要去動那些經過SLF4JAPI實現的代碼。
  • 很是充分的文檔  官方網站有兩百多頁的文檔。
  • 自動從新加載配置文件  當配置文件修改,Logback-classic能自動從新加載配置文件。掃描過程快且安全,它並不須要另外建立一個掃描線程。
  • Lilith   Lilith是log事件的觀察者,和log4j的chainsaw相似。而lilith還能處理大數量的log數據 。
  • 謹慎的模式和很是友好的恢復  在謹慎模式下,多個FileAppender實例跑在多個JVM下,能 夠安全地寫道同一個日誌文件,RollingFileAppender會有些限制。Logback的FileAppender和它的子類包括 RollingFileAppender可以很是友好地從I/O異常中恢復。
  • 配置文件能夠處理不一樣的狀況   開發人員常常須要判斷不一樣的Logback配置文件在不一樣的環境下(開發,測試,生產)。
  • Filters(過濾器)  有些時候,須要診斷一個問題,須要打出日誌。在log4j,只有下降日誌級別,不過這樣會打出大量的日誌,會影響應用性能。在Logback,你能夠繼續 保持那個日誌級別而除掉某種特殊狀況,如alice這個用戶登陸,她的日誌將打在DEBUG級別而其餘用戶能夠繼續打在WARN級別。要實現這個功能只需 加4行XML配置。能夠參考MDCFIlter 。
  • SiftingAppender(一個很是多功能的Appender)  它能夠用來分割日誌文件根據任何一個給定的運行參數。如,SiftingAppender可以區別日誌事件跟進用戶的Session,而後每一個用戶會有一個日誌文件。
  • 自動壓縮已經打出來的log  RollingFileAppender在產生新文件的時候,會自動壓縮已經打出來的日誌文件。壓縮是個異步過程,因此甚至對於大的日誌文件,在壓縮過程當中應用不會受任何影響。
  • 堆棧樹帶有包版本  Logback在打出堆棧樹日誌時,會帶上包的數據。
  • 自動去除舊的日誌文件  經過設置TimeBasedRollingPolicy或者SizeAndTimeBasedFNATP的maxHistory屬性,你能夠控制已經產生日誌文件的最大數量。

      總之,logback比log4j優秀。

3.3 logback配置

      Logback 配置文件的語法很是靈活。正由於靈活,因此沒法用 DTD 或 XML schema 進行定義。儘管如此,能夠這樣描述配置文件的基本結構:以<configuration>開頭,後面有零個或多個<appender>元素,有零個或多個<logger>元素,有最多一個<root>元素。

      logback配置文件實例:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定義日誌文件的存儲地址 勿在 LogBack 的配置中使用相對路徑-->  
    <property name="LOG_HOME" value="/home" />  
    <!-- 控制檯輸出 -->   
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
             <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日誌消息,%n是換行符--> 
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>   
        </encoder> 
    </appender>
    <!-- 按照天天生成日誌文件 -->   
    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">   
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日誌文件輸出的文件名-->
            <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern> 
            <!--日誌文件保留天數-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>   
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日誌消息,%n是換行符--> 
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>   
        </encoder> 
        <!--日誌文件最大的大小-->
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
         <MaxFileSize>10MB</MaxFileSize>
       </triggeringPolicy>
    </appender> 
    
    <!--myibatis log configure--> 
    <logger name="com.apache.ibatis" level="TRACE"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>
    
    <!-- 日誌輸出級別 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root> 
</configuration>
相關文章
相關標籤/搜索