Spring Boot配置日志的實現(xiàn)步驟
一、寫在前面
對于日志文件,相信大家都并不陌生,通過在關鍵位置打印相關的日志,有利于快速跟蹤和定位軟件系統(tǒng)運行中存在的問題。
在之前的 Java 實現(xiàn)日志記錄的文章中,我們介紹了能實現(xiàn)日志記錄的主流框架有 Log4j、Log4j2、Logback 等,通過一些性能測試發(fā)現(xiàn),Logback 和 Log4j2 兩個都比較優(yōu)秀。同時,它們都支持與 SLF4J 框架的集成,可以輕松實現(xiàn)系統(tǒng)日志框架實現(xiàn)的切換,這主要得益于門面模式的設計。
當采用 Slf4j 來實現(xiàn)日志輸出時,我們不需要再糾結到底是用 Log4j2 還是用 Logback 。Slf4j 相當于一個門面接口,可以讓代碼更加統(tǒng)一,同時它并不是一個日志實現(xiàn)框架,具體的實現(xiàn)會在 Slf4j 接口被調用的時候委托給具體的日志框架來實現(xiàn)。比如,當系統(tǒng)中有 Logback 時,就委托 Logback 來輸出日志;當有 Log4j2 時,就委托 Log4j2 來實現(xiàn);如果兩者同時存在,可能會報循環(huán)依賴的錯誤,因此在項目添加依賴的時候,只能選擇其中一個,如果有不兼容的問題,需要手動排除。
對于一個 Java web 項目,當采用Slf4j + Logback來實現(xiàn)日志信息的輸出時,通常會添加類似于如下的相關依賴包。
<!-- 添加slf4j依賴包 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- 添加logback依賴包 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
然后,在項目根目錄下創(chuàng)建logback.xml并配置相關參數(shù),示例如下。
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan:當此屬性設置為true時,配置文件如果發(fā)生改變,將會被重新加載,默認值為true。 scanPeriod:設置監(jiān)測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。
debug:當此屬性設置為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)。默認值為false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--
%d{yyyy-MM-dd HH:mm:ss} [%level] - %msg%n
Logger: %logger
Class: %class
File: %file
Caller: %caller
Line: %line
Message: %m
Method: %M
Relative: %relative
Thread: %thread
Exception: %ex
xException: %xEx
nopException: %nopex
rException: %rEx
Marker: %marker
newline:%n
-->
<property name="CUSTOM_LOG_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{90} - %msg%n" />
<!-- 上下文名稱 -->
<contextName>${CONTEXT_NAME}</contextName>
<!-- 日志輸出組件 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 對日志進行格式化。 -->
<encoder>
<pattern>${CUSTOM_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 日志級別為INFO,日志輸出到控制臺 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
最后,通過門面接口來輸出日志,示例如下:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogPrintUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(LogPrintUtil.class);
public static void main(String[] args){
LOGGER.info("info信息");
LOGGER.warn("warn信息");
LOGGER.error("error信息");
}
}
二、Spring Boot 日志配置
當我們采用 SpringBoot 框架來開發(fā)系統(tǒng)的時候,其實默認已經(jīng)幫我們集成好了spring-boot-starter-logging日志依賴包,它底層采用的就是上面介紹的logback日志實現(xiàn)框架,同時也集成了Slf4j依賴庫。
默認的logback日志配置文件在org/springframework/boot/logging/logback/defaults.xml下,我們只需要在相關的位置采用slf4j接口來打印日志即可,示例如下:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class LogApplication {
private static final Logger LOGGER = LoggerFactory.getLogger(LogApplication.class);
public static void main(String[] args) {
SpringApplication.run(LogApplication.class, args);
LOGGER.error("Hello World");
LOGGER.warn("Hello World");
LOGGER.info("Hello World");
LOGGER.debug("Hello World");
LOGGER.trace("Hello World");
}
}
啟動服務,可以看到類似于如下的打印結果:

默認的日志級別為info,如果想更改日志級別,可以在application.properties文件配置日志打印級別,比如改成trace,參數(shù)如下:
logging.level.root=trace
重新啟動服務,日志打印結果如下:

從控制臺輸出的結果可以初步分析出,trace級別最低,可以打印所有級別的日志。在整個日志體系中,級別從低到高分為:
TRACE < DEBUG < INFO < WARN < ERROR
級別越底,可打印的日志就更多;相反,級別越高,輸出的日志就更少。
從實際情況來看,太多的日志打印也未必是一件好事,有時候會把服務器磁盤撐爆,導致服務宕機。通常我們會配置INFO級別,在關鍵的位置打印相關信息即可。
2.1、Logback 自定義配置
在實際的業(yè)務開發(fā)中,通常我們會自定義Logback相關配置文件,有兩種做法。
- 第一種:創(chuàng)建
logback.xml配置文件,這種配置文件會直接被日志框架加載 - 第二種:創(chuàng)建
logback-spring.xml配置文件,這種配置文件不會直接被日志框架加載,而是先由 SpringBoot 去解析日志配置再加載,可以使用 SpringBoot 的一些高級功能,比如 Profile 屬性。
這里,我們選擇第二種方式,在src/main/resources目錄下,創(chuàng)建logback-spring.xml文件,一般標準寫法如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--定義相關變量-->
<property name="log.dir" value="log-demo" />
<property name="custom.log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{90} - %msg%n" />
<!-- 控制臺文件輸出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${custom.log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 文件輸出 -->
<appender name="APP_LOG"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.dir}/log_info.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${custom.log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.dir}/histroy/log-%d{yyyy-MM-dd}-%i.log
</fileNamePattern>
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>250MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="APP_LOG" />
</root>
</configuration>
其中CONSOLE節(jié)點,表示將日志輸出到控制臺;APP_LOG節(jié)點,表示將日志輸出到文件中,并自動將最近 30 天的日志文件進行歸檔到histroy 文件夾中。
如果想要讀取 Spring Boot properties 或根據(jù) Spring profile 定義日志配置,可以通過如下方式實現(xiàn)。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--獲取application.properties中定義的變量-->
<springProperty scope="context"
name="customLogPattern"
source="custom.log.pattern"
defaultValue="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{90} - %msg%n"/>
<springProperty scope="context"
name="LogDir"
source="custom.log.dir"
defaultValue="log-demo"/>
<!-- 控制臺文件輸出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${customLogPattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 文件輸出 -->
<appender name="APP_LOG"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LogDir}/log_info.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${customLogPattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--獲取springProfile變量-->
<springProfile name="dev">
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="APP_LOG" />
</root>
</springProfile>
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="APP_LOG" />
</root>
</springProfile>
</configuration>
application.properties文件相關的配置參數(shù)如下:
# 指定spring profiles 參數(shù)
spring.profiles.active=dev
# 自定義打印格式
custom.log.pattern=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{90} - %msg%n
# 自定義日志存儲路徑
custom.log.dir=app-demo
2.2、Log4j2 自定義配置
如果項目更傾向于使用 Log4j2 而不是 Logback,遷移方式也很簡單。
首先,需要排除掉默認 Logback 相關依賴庫,然后添加log4j2相關依賴包,示例如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
與Logback類似,當添加相關依賴包之后,Spring Boot 默認帶了一個log4j2.xml日志配置文件,在org/springframework/boot/logging/log4j2/log4j2.xml。
但是,基于業(yè)務的需要,通常我們會自定義配置文件,一般寫法如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info" monitorInterval="3">
<!--變量配置-->
<Properties>
<!--定義日志存儲的路徑 -->
<property name="log.dir" value="app-demo"/>
<!-- 定義日志輸出格式 -->
<property name="custom.log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %l %msg%n"/>
</Properties>
<Appenders>
<!-- 控制臺輸出 -->
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="${custom.log.pattern}"/>
</Console>
<!-- 文件輸出 -->
<RollingFile name="APP_LOG" fileName="${log.dir}/app.log"
filePattern="${log.dir}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="${custom.log.pattern}"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<!-- size根據(jù)實際的日志量填寫 -->
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<!-- 日志記錄級別 -->
<Root level="info">
<AppenderRef ref="CONSOLE"/>
<AppenderRef ref="APP_LOG"/>
</Root>
</Loggers>
</Configuration>
此時如果代碼中采用的是門面模式的編程方式,無需做任何的調整,即可實現(xiàn)日志框架的切換改造。
小結
最后總結一下,對于簡單的應用場景,并發(fā)量不高的環(huán)境下,可以采用 Logback 來實現(xiàn)日志打印;如果對性能要求較高,可以采用 Log4j2,據(jù)官方提供的測試報告中,Log4j2 在性能和新技術的應用,比 Logback 領先,畢竟是后起之秀,但是兼容性方面,Logback 更優(yōu)。
到此這篇關于Spring Boot配置日志的實現(xiàn)步驟的文章就介紹到這了,更多相關Spring Boot配置日志內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解SpringBoot中使用JPA作為數(shù)據(jù)持久化框架
這篇文章主要介紹了SpringBoot中使用JPA作為數(shù)據(jù)持久化框架的相關知識,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
springcloud+nacos實現(xiàn)灰度發(fā)布示例詳解
這篇文章主要介紹了springcloud+nacos實現(xiàn)灰度發(fā)布,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08
springboot實現(xiàn)excel表格導出幾種常見方法
在日常的開發(fā)中避免不了操作Excel,下面這篇文章主要給大家介紹了關于springboot實現(xiàn)excel表格導出的幾種常見方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-11-11
LocalDateTime日期時間格式中間多了一個T的問題及解決
這篇文章主要介紹了LocalDateTime日期時間格式中間多了一個T的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
Java中的List和MySQL中的varchar相互轉換的解決方案
實體類中有一個 List<String> 類型的屬性,對應于 MySQL 表里的 varchar 字段,使用 MyBatis 添加或查詢時能互相轉換,本文給大家介紹Java中的List和MySQL中的varchar相互轉換的解決方案,需要的朋友可以參考下2024-06-06
從application.properties配置文件獲取的漢字亂碼的解決方法
平時從配置文件各種讀取配置參數(shù)都正常,但是有時候放了個中文就亂碼,你肯定試過網(wǎng)上好多方法,都沒解決,那么來看下面,恭喜你終于找這里了,本文給大家介紹了從application.properties配置文件獲取的漢字亂碼的解決方法,需要的朋友可以參考下2024-03-03

