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:日誌信息以及換行