Spring Boot配置日志的實現(xiàn)步驟
一、寫在前面
對于日志文件,相信大家都并不陌生,通過在關(guān)鍵位置打印相關(guā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)日志輸出時,我們不需要再糾結(jié)到底是用 Log4j2 還是用 Logback 。Slf4j 相當于一個門面接口,可以讓代碼更加統(tǒng)一,同時它并不是一個日志實現(xiàn)框架,具體的實現(xiàn)會在 Slf4j 接口被調(diào)用的時候委托給具體的日志框架來實現(xiàn)。比如,當系統(tǒng)中有 Logback 時,就委托 Logback 來輸出日志;當有 Log4j2 時,就委托 Log4j2 來實現(xiàn);如果兩者同時存在,可能會報循環(huán)依賴的錯誤,因此在項目添加依賴的時候,只能選擇其中一個,如果有不兼容的問題,需要手動排除。
對于一個 Java web 項目,當采用Slf4j + Logback來實現(xiàn)日志信息的輸出時,通常會添加類似于如下的相關(guā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并配置相關(guān)參數(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下,我們只需要在相關(guān)的位置采用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"); } }
啟動服務,可以看到類似于如下的打印結(jié)果:
默認的日志級別為info
,如果想更改日志級別,可以在application.properties
文件配置日志打印級別,比如改成trace
,參數(shù)如下:
logging.level.root=trace
重新啟動服務,日志打印結(jié)果如下:
從控制臺輸出的結(jié)果可以初步分析出,trace
級別最低,可以打印所有級別的日志。在整個日志體系中,級別從低到高分為:
TRACE < DEBUG < INFO < WARN < ERROR
級別越底,可打印的日志就更多;相反,級別越高,輸出的日志就更少。
從實際情況來看,太多的日志打印也未必是一件好事,有時候會把服務器磁盤撐爆,導致服務宕機。通常我們會配置INFO
級別,在關(guān)鍵的位置打印相關(guān)信息即可。
2.1、Logback 自定義配置
在實際的業(yè)務開發(fā)中,通常我們會自定義Logback
相關(guān)配置文件,有兩種做法。
- 第一種:創(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> <!--定義相關(guān)變量--> <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
文件相關(guān)的配置參數(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 相關(guān)依賴庫,然后添加log4j2
相關(guān)依賴包,示例如下:
<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
類似,當添加相關(guān)依賴包之后,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>
此時如果代碼中采用的是門面模式的編程方式,無需做任何的調(diào)整,即可實現(xiàn)日志框架的切換改造。
小結(jié)
最后總結(jié)一下,對于簡單的應用場景,并發(fā)量不高的環(huán)境下,可以采用 Logback 來實現(xiàn)日志打印;如果對性能要求較高,可以采用 Log4j2,據(jù)官方提供的測試報告中,Log4j2 在性能和新技術(shù)的應用,比 Logback 領(lǐng)先,畢竟是后起之秀,但是兼容性方面,Logback 更優(yōu)。
到此這篇關(guān)于Spring Boot配置日志的實現(xiàn)步驟的文章就介紹到這了,更多相關(guān)Spring Boot配置日志內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解SpringBoot中使用JPA作為數(shù)據(jù)持久化框架
這篇文章主要介紹了SpringBoot中使用JPA作為數(shù)據(jù)持久化框架的相關(guān)知識,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03JAVA中常用的數(shù)據(jù)結(jié)構(gòu)和XML使用解析
這篇文章主要介紹了JAVA中常用的數(shù)據(jù)結(jié)構(gòu)和XML使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04springcloud+nacos實現(xiàn)灰度發(fā)布示例詳解
這篇文章主要介紹了springcloud+nacos實現(xiàn)灰度發(fā)布,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08springboot實現(xiàn)excel表格導出幾種常見方法
在日常的開發(fā)中避免不了操作Excel,下面這篇文章主要給大家介紹了關(guān)于springboot實現(xiàn)excel表格導出的幾種常見方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-11-11LocalDateTime日期時間格式中間多了一個T的問題及解決
這篇文章主要介紹了LocalDateTime日期時間格式中間多了一個T的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03Java中的List和MySQL中的varchar相互轉(zhuǎn)換的解決方案
實體類中有一個 List<String> 類型的屬性,對應于 MySQL 表里的 varchar 字段,使用 MyBatis 添加或查詢時能互相轉(zhuǎn)換,本文給大家介紹Java中的List和MySQL中的varchar相互轉(zhuǎn)換的解決方案,需要的朋友可以參考下2024-06-06從application.properties配置文件獲取的漢字亂碼的解決方法
平時從配置文件各種讀取配置參數(shù)都正常,但是有時候放了個中文就亂碼,你肯定試過網(wǎng)上好多方法,都沒解決,那么來看下面,恭喜你終于找這里了,本文給大家介紹了從application.properties配置文件獲取的漢字亂碼的解決方法,需要的朋友可以參考下2024-03-03