Spring Boot配置日志的實(shí)現(xiàn)步驟
一、寫在前面
對(duì)于日志文件,相信大家都并不陌生,通過(guò)在關(guān)鍵位置打印相關(guān)的日志,有利于快速跟蹤和定位軟件系統(tǒng)運(yùn)行中存在的問(wèn)題。
在之前的 Java 實(shí)現(xiàn)日志記錄的文章中,我們介紹了能實(shí)現(xiàn)日志記錄的主流框架有 Log4j、Log4j2、Logback 等,通過(guò)一些性能測(cè)試發(fā)現(xiàn),Logback 和 Log4j2 兩個(gè)都比較優(yōu)秀。同時(shí),它們都支持與 SLF4J 框架的集成,可以輕松實(shí)現(xiàn)系統(tǒng)日志框架實(shí)現(xiàn)的切換,這主要得益于門面模式的設(shè)計(jì)。
當(dāng)采用 Slf4j 來(lái)實(shí)現(xiàn)日志輸出時(shí),我們不需要再糾結(jié)到底是用 Log4j2 還是用 Logback 。Slf4j 相當(dāng)于一個(gè)門面接口,可以讓代碼更加統(tǒng)一,同時(shí)它并不是一個(gè)日志實(shí)現(xiàn)框架,具體的實(shí)現(xiàn)會(huì)在 Slf4j 接口被調(diào)用的時(shí)候委托給具體的日志框架來(lái)實(shí)現(xiàn)。比如,當(dāng)系統(tǒng)中有 Logback 時(shí),就委托 Logback 來(lái)輸出日志;當(dāng)有 Log4j2 時(shí),就委托 Log4j2 來(lái)實(shí)現(xiàn);如果兩者同時(shí)存在,可能會(huì)報(bào)循環(huán)依賴的錯(cuò)誤,因此在項(xiàng)目添加依賴的時(shí)候,只能選擇其中一個(gè),如果有不兼容的問(wèn)題,需要手動(dòng)排除。
對(duì)于一個(gè) Java web 項(xiàng)目,當(dāng)采用Slf4j + Logback來(lái)實(shí)現(xiàn)日志信息的輸出時(shí),通常會(huì)添加類似于如下的相關(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>
然后,在項(xiàng)目根目錄下創(chuàng)建logback.xml并配置相關(guān)參數(shù),示例如下。
<?xml version="1.0" encoding="UTF-8"?> <!-- scan:當(dāng)此屬性設(shè)置為true時(shí),配置文件如果發(fā)生改變,將會(huì)被重新加載,默認(rèn)值為true。 scanPeriod:設(shè)置監(jiān)測(cè)配置文件是否有修改的時(shí)間間隔,如果沒(méi)有給出時(shí)間單位,默認(rèn)單位是毫秒。當(dāng)scan為true時(shí),此屬性生效。默認(rèn)的時(shí)間間隔為1分鐘。 debug:當(dāng)此屬性設(shè)置為true時(shí),將打印出logback內(nèi)部日志信息,實(shí)時(shí)查看logback運(yùn)行狀態(tài)。默認(rèn)值為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"> <!-- 對(duì)日志進(jìn)行格式化。 --> <encoder> <pattern>${CUSTOM_LOG_PATTERN}</pattern> <charset>UTF-8</charset> </encoder> </appender> <!-- 日志級(jí)別為INFO,日志輸出到控制臺(tái) --> <root level="INFO"> <appender-ref ref="CONSOLE" /> </root> </configuration>
最后,通過(guò)門面接口來(lái)輸出日志,示例如下:
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 日志配置
當(dāng)我們采用 SpringBoot 框架來(lái)開發(fā)系統(tǒng)的時(shí)候,其實(shí)默認(rèn)已經(jīng)幫我們集成好了spring-boot-starter-logging日志依賴包,它底層采用的就是上面介紹的logback日志實(shí)現(xiàn)框架,同時(shí)也集成了Slf4j依賴庫(kù)。
默認(rèn)的logback日志配置文件在org/springframework/boot/logging/logback/defaults.xml下,我們只需要在相關(guān)的位置采用slf4j接口來(lái)打印日志即可,示例如下:
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"); } }
啟動(dòng)服務(wù),可以看到類似于如下的打印結(jié)果:
默認(rèn)的日志級(jí)別為info
,如果想更改日志級(jí)別,可以在application.properties
文件配置日志打印級(jí)別,比如改成trace
,參數(shù)如下:
logging.level.root=trace
重新啟動(dòng)服務(wù),日志打印結(jié)果如下:
從控制臺(tái)輸出的結(jié)果可以初步分析出,trace
級(jí)別最低,可以打印所有級(jí)別的日志。在整個(gè)日志體系中,級(jí)別從低到高分為:
TRACE < DEBUG < INFO < WARN < ERROR
級(jí)別越底,可打印的日志就更多;相反,級(jí)別越高,輸出的日志就更少。
從實(shí)際情況來(lái)看,太多的日志打印也未必是一件好事,有時(shí)候會(huì)把服務(wù)器磁盤撐爆,導(dǎo)致服務(wù)宕機(jī)。通常我們會(huì)配置INFO
級(jí)別,在關(guān)鍵的位置打印相關(guān)信息即可。
2.1、Logback 自定義配置
在實(shí)際的業(yè)務(wù)開發(fā)中,通常我們會(huì)自定義Logback
相關(guān)配置文件,有兩種做法。
- 第一種:創(chuàng)建
logback.xml
配置文件,這種配置文件會(huì)直接被日志框架加載 - 第二種:創(chuàng)建
logback-spring.xml
配置文件,這種配置文件不會(huì)直接被日志框架加載,而是先由 SpringBoot 去解析日志配置再加載,可以使用 SpringBoot 的一些高級(jí)功能,比如 Profile 屬性。
這里,我們選擇第二種方式,在src/main/resources
目錄下,創(chuàng)建logback-spring.xml
文件,一般標(biāo)準(zhǔn)寫法如下:
<?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" /> <!-- 控制臺(tái)文件輸出 --> <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é)點(diǎn),表示將日志輸出到控制臺(tái);APP_LOG
節(jié)點(diǎn),表示將日志輸出到文件中,并自動(dòng)將最近 30 天的日志文件進(jìn)行歸檔到histroy
文件夾中。
如果想要讀取 Spring Boot properties 或根據(jù) Spring profile 定義日志配置,可以通過(guò)如下方式實(shí)現(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"/> <!-- 控制臺(tái)文件輸出 --> <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 # 自定義日志存儲(chǔ)路徑 custom.log.dir=app-demo
2.2、Log4j2 自定義配置
如果項(xiàng)目更傾向于使用 Log4j2 而不是 Logback,遷移方式也很簡(jiǎn)單。
首先,需要排除掉默認(rèn) Logback 相關(guān)依賴庫(kù),然后添加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
類似,當(dāng)添加相關(guān)依賴包之后,Spring Boot 默認(rèn)帶了一個(gè)log4j2.xml
日志配置文件,在org/springframework/boot/logging/log4j2/log4j2.xml
。
但是,基于業(yè)務(wù)的需要,通常我們會(huì)自定義配置文件,一般寫法如下:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="info" monitorInterval="3"> <!--變量配置--> <Properties> <!--定義日志存儲(chǔ)的路徑 --> <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> <!-- 控制臺(tái)輸出 --> <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ù)實(shí)際的日志量填寫 --> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> </RollingFile> </Appenders> <Loggers> <!-- 日志記錄級(jí)別 --> <Root level="info"> <AppenderRef ref="CONSOLE"/> <AppenderRef ref="APP_LOG"/> </Root> </Loggers> </Configuration>
此時(shí)如果代碼中采用的是門面模式的編程方式,無(wú)需做任何的調(diào)整,即可實(shí)現(xiàn)日志框架的切換改造。
小結(jié)
最后總結(jié)一下,對(duì)于簡(jiǎn)單的應(yīng)用場(chǎng)景,并發(fā)量不高的環(huán)境下,可以采用 Logback 來(lái)實(shí)現(xiàn)日志打印;如果對(duì)性能要求較高,可以采用 Log4j2,據(jù)官方提供的測(cè)試報(bào)告中,Log4j2 在性能和新技術(shù)的應(yīng)用,比 Logback 領(lǐng)先,畢竟是后起之秀,但是兼容性方面,Logback 更優(yōu)。
到此這篇關(guān)于Spring Boot配置日志的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)Spring Boot配置日志內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring Boot 日志級(jí)別及配置詳解
- springboot中l(wèi)ogback日志配置的詳細(xì)說(shuō)明
- 一文帶你搞定SpringBoot Log4j2日志配置文件
- SpringBoot日志配置SLF4J和Logback的方法實(shí)現(xiàn)
- Spring?Boot整合log4j2日志配置的詳細(xì)教程
- SpringBoot日志配置全過(guò)程
- Spring?Boot日志打印配置詳細(xì)介紹
- Springboot日志配置的實(shí)現(xiàn)示例
- SpringBoot3配置Logback日志滾動(dòng)文件的方法
- 如何為?Spring?Boot?項(xiàng)目配置?Logback?日志
相關(guān)文章
詳解SpringBoot中使用JPA作為數(shù)據(jù)持久化框架
這篇文章主要介紹了SpringBoot中使用JPA作為數(shù)據(jù)持久化框架的相關(guān)知識(shí),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03JAVA中常用的數(shù)據(jù)結(jié)構(gòu)和XML使用解析
這篇文章主要介紹了JAVA中常用的數(shù)據(jù)結(jié)構(gòu)和XML使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04mybatis對(duì)于list更新sql語(yǔ)句的寫法說(shuō)明
這篇文章主要介紹了mybatis對(duì)于list更新sql語(yǔ)句的寫法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08springcloud+nacos實(shí)現(xiàn)灰度發(fā)布示例詳解
這篇文章主要介紹了springcloud+nacos實(shí)現(xiàn)灰度發(fā)布,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08springboot實(shí)現(xiàn)excel表格導(dǎo)出幾種常見(jiàn)方法
在日常的開發(fā)中避免不了操作Excel,下面這篇文章主要給大家介紹了關(guān)于springboot實(shí)現(xiàn)excel表格導(dǎo)出的幾種常見(jiàn)方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11LocalDateTime日期時(shí)間格式中間多了一個(gè)T的問(wèn)題及解決
這篇文章主要介紹了LocalDateTime日期時(shí)間格式中間多了一個(gè)T的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03Java中的List和MySQL中的varchar相互轉(zhuǎn)換的解決方案
實(shí)體類中有一個(gè) List<String> 類型的屬性,對(duì)應(yīng)于 MySQL 表里的 varchar 字段,使用 MyBatis 添加或查詢時(shí)能互相轉(zhuǎn)換,本文給大家介紹Java中的List和MySQL中的varchar相互轉(zhuǎn)換的解決方案,需要的朋友可以參考下2024-06-06從application.properties配置文件獲取的漢字亂碼的解決方法
平時(shí)從配置文件各種讀取配置參數(shù)都正常,但是有時(shí)候放了個(gè)中文就亂碼,你肯定試過(guò)網(wǎng)上好多方法,都沒(méi)解決,那么來(lái)看下面,恭喜你終于找這里了,本文給大家介紹了從application.properties配置文件獲取的漢字亂碼的解決方法,需要的朋友可以參考下2024-03-03