目錄
?默認日志框架
日志配置
更換日志框架
排除默認Logback
引入目標日志框架
添加配置文件
?logback.xml
SpringBoot的核心設計宗旨是約定大于配置,很多框架功能都給你默認加載和配置完成供你使用,但這就要求使用者對框架有一定的理解和改造能力,比如這個日志框架,是其他框架的基礎,需要默認指定日志框架,但如果想要深入了解日志框架內容是很多的,比如logback 和 log4j 都是基于 SLF4J(Simple Logging Facade for Java) 的門面(Facade)設計模式進行集成的。
- logback是 SLF4J 的原生實現框架,由 SLF4J 的作者設計,與 SLF4J 無縫集成,是SLF4J 的“親兒子”,集成更緊密;
- log4j 不是原生支持 SLF4J,需要通過 橋接器(Bridge) 實現適配
?默認日志框架
Spring Boot?默認使用Logback作為日志框架,通過spring-boot-starter-logging
實現自動配置。該依賴會被其他Starter(如spring-boot-starter-web
)隱式引入。
若未在application.yml
或application.properties
中配置日志,Spring Boot會使用以下默認值:
-
日志級別:Root日志級別默認為
INFO
。 -
輸出目標:日志僅輸出到控制臺(不寫入文件)。
-
格式:
-
時間戳 | 日志級別 | 進程ID | 線程名 | Logger名稱 | 日志消息 示例: 2023-10-05 14:30:00.123 INFO 12345 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080
日志配置
application.yml中的常用配置:
logging:file:name: app.log # 日志文件名(默認生成在項目根目錄)path: /var/log # 日志目錄(與`file.name`二選一)level:root: INFO # Root日志級別org.springframework.web: DEBUG # 指定包日志級別pattern:console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"
若需詳細的springboot啟動日志(如Bean加載過程),可通過以下方式配置:
方式1:通過啟動參數
在啟動命令中添加--debug參數,僅打印Spring Boot核心調試日志:
java -jar your-app.jar --debug方式2:全局DEBUG日志
在application.yml中設置Root日志級別為DEBUG:
logging:level:root: DEBUG方式3:特定包日志
若僅需查看Spring容器的初始化日志:
logging:level:org.springframework.boot: DEBUGorg.springframework.context: DEBUG
更換日志框架
Spring Boot支持快速切換至其他日志框架(如Log4j2),需以下步驟:
排除默認Logback
在Maven的pom.xml
中排除spring-boot-starter-logging
:?
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions>
</dependency>
引入目標日志框架
以Log4j2為例,添加對應Starter:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
添加配置文件
在src/main/resources
目錄下創建日志配置文件:
-
Log4j2:
log4j2.xml
或log4j2-spring.xml
-
示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>
?logback.xml
Spring Boot 默認在 classpath 下查找?logback.xml
,如果存在,會直接使用它作為 Logback 的配置,logback.xml
?的優先級?高于?Spring Boot 的默認日志配置(如?application.yml
?中的?logging
?配置項),如果同時存在?logback.xml
?和?application.yml
?中的日志配置,logback.xml
?的配置會覆蓋?application.yml
。
如果希望完全由?logback.xml
?控制日志行為,可以在?application.yml
?中禁用 Spring Boot 的默認日志配置:logging:? config: none ?# 禁用所有默認日志配置
在?src/main/resources
?目錄下新建?logback.xml
,例如:
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 定義控制臺輸出 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!-- 定義文件輸出 --><appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>app.log</file><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!-- Root 日志級別 --><root level="INFO"><appender-ref ref="CONSOLE"/><appender-ref ref="FILE"/></root><!-- 特定包的日志級別 --><logger name="org.springframework.web" level="DEBUG"/>
</configuration>
?雖然?logback.xml
?會被自動加載,但?Spring Boot 官方推薦使用?logback-spring.xml
,原因如下:
配置文件 | 特點 |
---|---|
logback.xml | 直接由 Logback 加載,無法使用 Spring Boot 的增強功能(如 Profile 多環境支持)。 |
logback-spring.xml | 由 Spring Boot 加載,支持?Profile 條件化配置(如?<springProfile> ?標簽)。 |
<configuration><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!-- 開發環境:輸出 DEBUG 級別到控制臺 --><springProfile name="dev"><root level="DEBUG"><appender-ref ref="CONSOLE"/></root></springProfile><!-- 生產環境:輸出 INFO 級別到文件 --><springProfile name="prod"><root level="INFO"><appender-ref ref="FILE"/></root></springProfile>
</configuration>
?