Spring Boot Logback日誌

Spring Boot 日誌


使用日誌框架來幫助我們記錄系統運行情況,比如當系統發生異常信息,運行正常的信息等等都可以記錄,便於系統維護。

Logback日誌框架


logback是在java社區被廣泛使用的一種日誌框架。logback的前生是log4j。相比log4j而言,logback可以更快實現並且提供更多的選項和靈活的配置。

除了使用LogBack,我們還要使用SLF4J來作爲LogBack的接口。不過SPring Boot 框架已經幫助我們集成這些依賴。

Logback的體系結構

三個類類組成了logback的體系結構:Logger、Appender、Layout.

  • Logger:日誌信息容器
  • Appender 日誌信息位於什麼地方。比如控制檯、文件等等。
  • Layout:日誌信息輸出格式。

開始Coding

在開始編程時,我們需要在 resources 目錄添加 logback.xml 文件

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

開始測試

@SpringBootTest
class WecatorderApplicationTests {
    private final static Logger logger = LoggerFactory.getLogger(WecatorderApplication.class);
    @Test
    void contextLoads() {
        logger.info("Example log from {}", "hello logger");
    }
}

Logger Context


初始化一個logger通過 SLF4J 或者 Logback

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

logger是有繼承關係的

比如,Example類位於com.test.logback包下。另一個ExampleAppender位於com.test.logback.appenders包下。那麼ExampleAppender的logger是Example的logger的孩子。

所有的logger都是預先定義root logger的後代
每個logger都一個級別,可以配置級別在配置文件中,也可以通過編程Logger.setLevel()來設置級別。通過代碼設置會覆蓋配置文件中級別

級別的優先級:ERROR>WARN>INFO>TRACE

等級越高先輸出

如果一個logger沒有顯示指定級別,它將繼承最近的祖先的級別

ch.qos.logback.classic.Logger parentLogger = 
  (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.baeldung.logback");
 
parentLogger.setLevel(Level.INFO);
 
Logger childlogger = 
  (ch.qos.logback.classic.Logger)LoggerFactory.getLogger("com.baeldung.logback.tests");
 
parentLogger.warn("This message is logged because WARN > INFO.");
parentLogger.debug("This message is not logged because DEBUG < INFO.");
childlogger.info("INFO == INFO");
childlogger.debug("DEBUG < INFO");

輸出信息

20:31:29.586 [main] WARN com.baeldung.logback - This message is logged because WARN > INFO.
20:31:29.594 [main] INFO com.baeldung.logback.tests - INFO == INFO

childlogger並沒有顯示指定Level,childlogger是繼承parentLogger,所以childlogger也具有INFO級別,所以只會打印級別大於等於INFO的日誌

Appenders


ConsoleAppender

使用ConsoleAppender輸出信息到控制檯上

FileAppender

使用FileAppender輸出信息到文件

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>tests.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="debug">
        <appender-ref ref="FILE" />
    </root>
</configuration>
RollingFileAppender

有時我們並不需要把日誌信息都追加到同一個文件中。我需要在按時回滾文件,或者按文件大小回滾。那就需要用到RollingFileAppender了

<property name="LOG_FILE" value="LogFile" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_FILE}.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- daily rollover -->
        <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>
 
        <!-- keep 30 days' worth of history capped at 3GB total size -->
        <maxHistory>30</maxHistory>
        <totalSizeCap>3GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
</appender> 

RollingFileAppender提供回滾策略以滿足不同回滾需求,當達到3GB時,會採用FIFO的刪除前面歸檔的文件

Layouts


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

參數含義:

  • %d{HH:mm:ss.SSS}:時間戳,時,分,秒和毫秒
  • [%thread]:線程名
  • %-5level:日誌級別,填充5個字符
  • %logger{36}:logger名字(類名),截斷36個字符
  • %msg%n:日誌信息以及換行

參考

發佈了7 篇原創文章 · 獲贊 2 · 訪問量 751
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章