Spring Boot集成Logback終極指南之從基礎(chǔ)到高級(jí)配置實(shí)戰(zhàn)指南
一、Logback簡(jiǎn)介與Spring Boot集成基礎(chǔ)
1.1 Logback是什么?
Logback是一個(gè)可靠、通用且快速的Java日志框架,作為L(zhǎng)og4j的繼承者,由Log4j創(chuàng)始人設(shè)計(jì)。它由三個(gè)模塊組成:
- logback-core:基礎(chǔ)模塊
- logback-classic:實(shí)現(xiàn)了SLF4J API
- logback-access:與Servlet容器集成提供HTTP訪問日志功能
為什么選擇Logback?
- 性能比Log4j更高
- 豐富的文檔
- 自動(dòng)重新加載配置文件
- 自動(dòng)壓縮日志文件
- 更靈活的過濾功能
- 更豐富的日志格式
1.2 Spring Boot默認(rèn)日志框架
Spring Boot默認(rèn)使用Logback作為日志框架,當(dāng)你使用spring-boot-starter
或spring-boot-starter-web
時(shí),已經(jīng)自動(dòng)引入了Logback依賴。
<!-- 在Spring Boot項(xiàng)目中,你不需要顯式添加Logback依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
1.3 基本日志使用示例
import org.slf4j.Logger; import org.slf4j.LoggerFactory; @RestController public class DemoController { // 獲取Logger實(shí)例,通常以當(dāng)前類作為參數(shù) private static final Logger logger = LoggerFactory.getLogger(DemoController.class); @GetMapping("/demo") public String demo() { logger.trace("This is a TRACE level message"); logger.debug("This is a DEBUG level message"); logger.info("This is an INFO level message"); logger.warn("This is a WARN level message"); logger.error("This is an ERROR level message"); return "Check your console or log file!"; } }
二、Logback配置文件詳解
2.1 配置文件加載順序
Spring Boot會(huì)按以下順序查找Logback配置文件:
logback-spring.xml
(推薦使用)logback.xml
- 如果以上都不存在,使用默認(rèn)配置
為什么推薦使用logback-spring.xml?
- 可以使用Spring Boot特有的
<springProperty>
標(biāo)簽 - 支持Spring Profile特定的配置
2.2 配置文件基本結(jié)構(gòu)
一個(gè)完整的Logback配置文件通常包含以下部分:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 屬性定義 --> <property name="LOG_HOME" value="./logs" /> <!-- 定義appender --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoder定義日志輸出格式 --> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 定義logger --> <logger name="com.example.demo" level="DEBUG" /> <!-- 根logger配置 --> <root level="INFO"> <appender-ref ref="CONSOLE" /> </root> </configuration>
三、核心組件深度解析
3.1 <configuration> 元素
<configuration>
是Logback配置文件的根元素,支持以下重要屬性:
屬性名 | 類型 | 默認(rèn)值 | 描述 |
---|---|---|---|
scan | boolean | false | 是否監(jiān)視配置文件變化 |
scanPeriod | 時(shí)間間隔 | 1分鐘 | 檢查配置文件變化的時(shí)間間隔 |
debug | boolean | false | 是否打印Logback內(nèi)部調(diào)試信息 |
packagingData | boolean | false | 是否包含調(diào)用者信息(影響性能) |
示例:
<configuration scan="true" scanPeriod="30 seconds" debug="false"> <!-- 配置內(nèi)容 --> </configuration>
最佳實(shí)踐:
- 開發(fā)環(huán)境可以開啟
scan
以便動(dòng)態(tài)調(diào)整配置 - 生產(chǎn)環(huán)境應(yīng)關(guān)閉
scan
和debug
以避免性能開銷 - 僅在需要診斷問題時(shí)開啟
packagingData
3.2 <property> 元素
用于定義變量,可在配置文件中重復(fù)使用:
屬性:
name
: 變量名(必填)value
: 變量值file
: 從外部文件加載屬性resource
: 從classpath資源加載屬性scope
: 作用域(“local"或"context”)
示例:
<!-- 直接定義 --> <property name="LOG_HOME" value="/var/logs/myapp" /> <!-- 從系統(tǒng)環(huán)境變量獲取 --> <property name="LOG_HOME" value="${LOG_DIR:-./logs}" /> <!-- 從外部文件加載 --> <property file="conf/logback.properties" /> <!-- 在Spring Boot中使用 --> <springProperty scope="context" name="appName" source="spring.application.name" />
變量引用方式: ${變量名}
作用域說明:
local
: 僅在當(dāng)前配置文件中有效context
: 在整個(gè)LoggerContext中有效
3.3 <timestamp> 元素
用于定義時(shí)間戳變量:
屬性:
key
: 變量名datePattern
: 日期格式(遵循Java SimpleDateFormat)timeReference
: 時(shí)間參考點(diǎn)("contextBirth"或當(dāng)前時(shí)間)
示例:
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss" /> <property name="LOG_FILE" value="${LOG_HOME}/log-${bySecond}.log" />
3.4 <appender> 元素
Appender負(fù)責(zé)定義日志輸出目的地,是Logback最核心的組件之一。
3.4.1 Appender通用結(jié)構(gòu)
<appender name="UNIQUE_NAME" class="APPENDER_CLASS"> <!-- 過濾器配置 --> <filter class="ch.qos.logback.core.filter.FilterClass" /> <!-- 布局/編碼器配置 --> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} %msg%n</pattern> </encoder> <!-- 其他特有配置 --> </appender>
3.4.2 ConsoleAppender
輸出日志到控制臺(tái)(System.out或System.err)
特有屬性:
target
: 輸出目標(biāo)(“System.out"或"System.err”),默認(rèn)為System.outwithJansi
: 是否啟用ANSI顏色支持(需jansi庫)
示例:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <target>System.out</target> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender>
3.4.3 FileAppender
輸出日志到單個(gè)文件
特有屬性:
file
: 日志文件路徑append
: 是否追加到文件末尾(默認(rèn)為true)prudent
: 是否安全模式(多進(jìn)程寫入同一文件時(shí)使用)
示例:
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>${LOG_HOME}/myapp.log</file> <append>true</append> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender>
3.4.4 RollingFileAppender
支持日志文件滾動(dòng)的增強(qiáng)FileAppender,必須配置rollingPolicy
特有屬性:
file
: 當(dāng)前活動(dòng)日志文件路徑rollingPolicy
: 滾動(dòng)策略配置triggeringPolicy
: 觸發(fā)策略配置
示例:
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}/myapp.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/myapp.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender>
3.4.5 滾動(dòng)策略詳解
Logback提供多種滾動(dòng)策略:
TimeBasedRollingPolicy基于時(shí)間的滾動(dòng)策略
屬性 | 說明 |
---|---|
fileNamePattern | 滾動(dòng)文件命名模式(必須包含%d) |
maxHistory | 保留的歷史日志文件最大數(shù)量 |
totalSizeCap | 所有日志文件總大小限制 |
cleanHistoryOnStart | 啟動(dòng)時(shí)是否清理歷史文件(默認(rèn)false) |
SizeAndTimeBasedRollingPolicy
結(jié)合時(shí)間和大小的滾動(dòng)策略
屬性 | 說明 |
---|---|
fileNamePattern | 必須包含%d和%i |
maxFileSize | 單個(gè)文件最大大小 |
maxHistory | 保留的歷史日志文件最大數(shù)量 |
totalSizeCap | 所有日志文件總大小限制 |
FixedWindowRollingPolicy
固定窗口滾動(dòng)策略
屬性 | 說明 |
---|---|
minIndex | 窗口最小索引 |
maxIndex | 窗口最大索引 |
fileNamePattern | 必須包含%i |
3.4.6 其他Appender類型
Appender類型 | 類名 | 用途 |
---|---|---|
SMTPAppender | ch.qos.logback.classic.net.SMTPAppender | 通過郵件發(fā)送錯(cuò)誤日志 |
DBAppender | ch.qos.logback.classic.db.DBAppender | 存儲(chǔ)日志到數(shù)據(jù)庫 |
SocketAppender | ch.qos.logback.classic.net.SocketAppender | 通過網(wǎng)絡(luò)socket發(fā)送日志 |
SyslogAppender | ch.qos.logback.classic.net.SyslogAppender | 發(fā)送日志到syslog服務(wù)器 |
3.5 <encoder> 元素
Encoder負(fù)責(zé)將日志事件轉(zhuǎn)換為字節(jié)數(shù)組并寫入輸出流。
3.5.1 PatternLayoutEncoder
最常用的Encoder實(shí)現(xiàn),支持豐富的模式表達(dá)式:
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> <outputPatternAsHeader>false</outputPatternAsHeader> <charset>UTF-8</charset> </encoder>
常用轉(zhuǎn)換符:
轉(zhuǎn)換符 | 說明 |
---|---|
%d | 日期時(shí)間 |
%thread | 線程名 |
%level | 日志級(jí)別 |
%logger | Logger名稱 |
%msg | 日志消息 |
%n | 換行符 |
%caller | 調(diào)用者信息 |
%mdc | MDC內(nèi)容 |
%ex | 異常堆棧 |
%marker | 日志標(biāo)記 |
日期格式:%d{格式}
,格式遵循Java SimpleDateFormat:
%d{yyyy-MM-dd HH:mm:ss.SSS}
%d{ISO8601}
%d{ABSOLUTE}
Logger名稱縮寫:%logger{長(zhǎng)度}
,如%logger{36}
表示最長(zhǎng)顯示36個(gè)字符
3.5.2 LayoutWrappingEncoder
包裝其他Layout實(shí)現(xiàn)的Encoder:
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </layout> </encoder>
3.6 <filter> 元素
Filter用于對(duì)日志事件進(jìn)行過濾,可以配置在Appender或Logger上。
3.6.1 LevelFilter
精確匹配特定級(jí)別:
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <!-- 匹配時(shí)的動(dòng)作 --> <onMismatch>DENY</onMismatch> <!-- 不匹配時(shí)的動(dòng)作 --> </filter>
動(dòng)作類型:
ACCEPT
: 接受日志事件DENY
: 拒絕日志事件NEUTRAL
: 中立,由后續(xù)過濾器決定
3.6.2 ThresholdFilter
閾值過濾,接受>=指定級(jí)別的日志:
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>WARN</level> </filter>
3.6.3 EvaluatorFilter
使用Groovy表達(dá)式過濾:
<filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator"> <expression> e.level.toInt() >= WARN.toInt() && e.getMessage().contains("important") </expression> </evaluator> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter>
3.6.4 自定義Filter
實(shí)現(xiàn)ch.qos.logback.core.filter.Filter
接口:
public class SampleFilter extends Filter<ILoggingEvent> { @Override public FilterReply decide(ILoggingEvent event) { if (event.getMessage().contains("special")) { return FilterReply.ACCEPT; } return FilterReply.NEUTRAL; } }
配置:
<filter class="com.example.SampleFilter" />
3.7 <logger> 和 <root> 元素
3.7.1 <logger>
配置特定Logger的日志行為:
屬性:
name
: Logger名稱(通常為包或類名)level
: 日志級(jí)別additivity
: 是否向上傳遞日志(默認(rèn)為true)
示例:
<!-- 配置特定包的日志級(jí)別 --> <logger name="com.example" level="DEBUG" /> <!-- 配置特定類的日志級(jí)別并禁用additivity --> <logger name="com.example.Service" level="TRACE" additivity="false"> <appender-ref ref="SPECIAL_APPENDER" /> </logger>
3.7.2 <root>
配置根Logger,所有Logger最終都繼承自Root Logger:
屬性:
level
: 根Logger的日志級(jí)別
示例:
<root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </root>
Logger繼承規(guī)則:
- 如果沒有配置特定logger,則繼承最近的祖先logger的級(jí)別
- 如果沒有配置任何logger,則使用root logger的級(jí)別
- 如果配置了logger但沒有指定級(jí)別,則繼承最近的祖先logger的級(jí)別
3.8 <turboFilter> 元素
TurboFilter是全局過濾器,在所有Logger之前執(zhí)行:
<turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter"> <Marker>important</Marker> <OnMatch>ACCEPT</OnMatch> <OnMismatch>NEUTRAL</OnMismatch> </turboFilter>
常用TurboFilter:
MDCFilter
: 基于MDC值過濾DynamicThresholdFilter
: 動(dòng)態(tài)閾值過濾LoggerFilter
: 基于Logger名稱過濾
四、高級(jí)配置與使用技巧
4.1 日志級(jí)別詳解
Logback支持以下日志級(jí)別(從低到高):
- TRACE
- DEBUG
- INFO
- WARN
- ERROR
日志級(jí)別繼承規(guī)則:
- 如果沒有配置特定logger,則繼承最近的祖先logger的級(jí)別
- 如果沒有配置任何logger,則使用root logger的級(jí)別
4.2 使用Spring Boot屬性
在logback-spring.xml
中可以使用Spring Boot的屬性:
<springProperty scope="context" name="appName" source="spring.application.name" defaultValue="myApp"/> <property name="LOG_HOME" value="./logs/${appName}" />
4.3 基于Profile的配置
可以為不同的Spring Profile配置不同的日志策略:
<springProfile name="dev"> <logger name="com.example.demo" level="DEBUG" /> </springProfile> <springProfile name="prod"> <logger name="com.example.demo" level="INFO" /> <root level="WARN"> <appender-ref ref="FILE" /> </root> </springProfile>
4.4 日志文件滾動(dòng)策略
TimeBasedRollingPolicy: 基于時(shí)間的滾動(dòng)策略
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/application.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy>
SizeAndTimeBasedRollingPolicy: 基于時(shí)間和大小的滾動(dòng)策略
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/application.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>10MB</maxFileSize> <maxHistory>30</maxHistory> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy>
4.5 日志過濾
LevelFilter: 按級(jí)別過濾
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <!-- 其他配置 --> </appender>
ThresholdFilter: 閾值過濾
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>WARN</level> </filter> <!-- 其他配置 --> </appender>
4.6 異步日志
使用AsyncAppender可以提高日志性能:
<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender"> <queueSize>512</queueSize> <discardingThreshold>0</discardingThreshold> <includeCallerData>false</includeCallerData> <appender-ref ref="FILE" /> </appender>
參數(shù)說明:
queueSize
: 隊(duì)列大?。J(rèn)256)discardingThreshold
: 當(dāng)隊(duì)列剩余容量小于此值時(shí),丟棄TRACE、DEBUG和INFO級(jí)別的日志(默認(rèn)隊(duì)列大小的20%)includeCallerData
: 是否包含調(diào)用者數(shù)據(jù)(影響性能)
最佳實(shí)踐:
- 生產(chǎn)環(huán)境推薦隊(duì)列大小設(shè)置為512-2048
- 除非必要,否則關(guān)閉includeCallerData
- 對(duì)于關(guān)鍵日志,設(shè)置discardingThreshold=0確保不丟棄
4.7 MDC (Mapped Diagnostic Context)
MDC可以用于在日志中添加上下文信息:
import org.slf4j.MDC; public class UserService { private static final Logger logger = LoggerFactory.getLogger(UserService.class); public void login(String userId) { MDC.put("userId", userId); logger.info("User logged in"); MDC.remove("userId"); } }
在配置文件中使用:
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{userId}] %-5level %logger{36} - %msg%n</pattern>
高級(jí)用法:
<!-- 僅當(dāng)MDC中存在userId時(shí)才顯示 --> <pattern>%d{yyyy-MM-dd} [%thread] %mdc{userId:-} %-5level %logger{36} - %msg%n</pattern>
4.8 條件配置
使用<if>
條件語句(需要Janino庫):
<if condition='property("env").equals("prod")'> <then> <root level="WARN"> <appender-ref ref="FILE" /> </root> </then> <else> <root level="DEBUG"> <appender-ref ref="CONSOLE" /> </root> </else> </if>
五、最佳實(shí)踐與常見問題
5.1 日志最佳實(shí)踐
合理使用日志級(jí)別:
- TRACE: 非常詳細(xì)的系統(tǒng)運(yùn)行信息,通常只在開發(fā)時(shí)使用
- DEBUG: 調(diào)試信息,有助于診斷問題
- INFO: 重要的業(yè)務(wù)處理信息
- WARN: 潛在的問題,但系統(tǒng)還能正常工作
- ERROR: 錯(cuò)誤事件,但系統(tǒng)還能繼續(xù)運(yùn)行
日志內(nèi)容規(guī)范:
- 記錄有意義的業(yè)務(wù)信息
- 避免記錄敏感信息(密碼、信用卡號(hào)等)
- 異常應(yīng)該記錄堆棧(使用logger.error(“message”, e))
性能考慮:
- 生產(chǎn)環(huán)境避免使用DEBUG級(jí)別
- 謹(jǐn)慎使用調(diào)用者數(shù)據(jù)(%C, %M, %F, %L等)
- 考慮使用異步日志
5.2 常見問題解決方案
問題1:日志文件不滾動(dòng)
- 檢查
fileNamePattern
中的日期模式 - 確保日志量達(dá)到滾動(dòng)條件
- 檢查文件權(quán)限
解決方案:
<!-- 確保配置了觸發(fā)策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>logs/app-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>50MB</maxFileSize> <!-- 必須配置 --> <maxHistory>30</maxHistory> </rollingPolicy>
問題2:日志文件太大
- 調(diào)整
maxFileSize
和maxHistory
- 使用
totalSizeCap
限制總大小 - 考慮按級(jí)別分離日志文件
問題3:日志輸出不全
- 檢查logger的級(jí)別設(shè)置
- 檢查是否有過濾器過濾掉了日志
- 檢查是否有多個(gè)配置文件的沖突
問題4:日志輸出亂碼
解決方案:
<encoder> <pattern>%msg%n</pattern> <charset>UTF-8</charset> <!-- 明確指定字符集 --> </encoder>
六、完整配置示例
6.1 開發(fā)環(huán)境配置 (logback-spring-dev.xml)
<?xml version="1.0" encoding="UTF-8"?> <!-- Logback配置文件的根標(biāo)簽,所有配置元素都需包含在此標(biāo)簽內(nèi) --> <configuration> <!-- 屬性定義部分,通過 <property> 標(biāo)簽定義可復(fù)用的屬性,方便在配置文件中引用 --> <!-- 定義日志文件存儲(chǔ)的主目錄 --> <property name="LOG_HOME" value="/var/logs/myapp" /> <!-- 定義日志輸出的格式模式,包含日期時(shí)間、線程名、日志級(jí)別、日志記錄器名稱和日志消息 --> <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" /> <!-- 控制臺(tái)Appender配置,用于將日志輸出到控制臺(tái) --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!-- 編碼器配置,將日志事件轉(zhuǎn)換為指定格式的字符串 --> <encoder> <!-- 使用前面定義的日志格式模式 --> <pattern>${LOG_PATTERN}</pattern> </encoder> <!-- 過濾器配置,只允許指定級(jí)別及以上的日志通過 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <!-- 設(shè)置過濾級(jí)別為 WARN,即只輸出 WARN 及以上級(jí)別的日志 --> <level>WARN</level> </filter> </appender> <!-- 主文件Appender配置,用于將日志輸出到文件,并支持滾動(dòng)策略 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 指定日志文件的路徑,使用前面定義的日志主目錄 --> <file>${LOG_HOME}/application.log</file> <!-- 編碼器配置,將日志事件轉(zhuǎn)換為指定格式的字符串 --> <encoder> <!-- 使用前面定義的日志格式模式 --> <pattern>${LOG_PATTERN}</pattern> </encoder> <!-- 滾動(dòng)策略配置,基于文件大小和時(shí)間進(jìn)行滾動(dòng) --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 滾動(dòng)后的文件命名模式,包含日期和序號(hào) --> <fileNamePattern>${LOG_HOME}/application.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 單個(gè)日志文件的最大大小,超過此大小將進(jìn)行滾動(dòng) --> <maxFileSize>50MB</maxFileSize> <!-- 保留的歷史日志文件的最大天數(shù) --> <maxHistory>30</maxHistory> <!-- 所有日志文件的總大小上限 --> <totalSizeCap>5GB</totalSizeCap> </rollingPolicy> </appender> <!-- 錯(cuò)誤日志Appender配置,專門用于記錄 ERROR 級(jí)別的日志 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 指定錯(cuò)誤日志文件的路徑,使用前面定義的日志主目錄 --> <file>${LOG_HOME}/error.log</file> <!-- 編碼器配置,將日志事件轉(zhuǎn)換為指定格式的字符串 --> <encoder> <!-- 使用前面定義的日志格式模式 --> <pattern>${LOG_PATTERN}</pattern> </encoder> <!-- 過濾器配置,只允許 ERROR 級(jí)別的日志通過 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 設(shè)置過濾級(jí)別為 ERROR --> <level>ERROR</level> <!-- 當(dāng)日志級(jí)別匹配時(shí),允許通過 --> <onMatch>ACCEPT</onMatch> <!-- 當(dāng)日志級(jí)別不匹配時(shí),拒絕通過 --> <onMismatch>DENY</onMismatch> </filter> <!-- 滾動(dòng)策略配置,基于時(shí)間進(jìn)行滾動(dòng) --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 滾動(dòng)后的文件命名模式,包含日期 --> <fileNamePattern>${LOG_HOME}/error.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 保留的歷史錯(cuò)誤日志文件的最大天數(shù) --> <maxHistory>90</maxHistory> </rollingPolicy> </appender> <!-- 異步Appender配置,用于異步處理日志,提高性能 --> <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender"> <!-- 異步隊(duì)列的大小,即最多可緩存的日志事件數(shù)量 --> <queueSize>1024</queueSize> <!-- 丟棄閾值,當(dāng)隊(duì)列剩余空間小于此值時(shí),會(huì)丟棄部分日志事件,設(shè)置為 0 表示不丟棄 --> <discardingThreshold>0</discardingThreshold> <!-- 引用前面定義的主文件Appender,將異步處理后的日志輸出到該 Appender --> <appender-ref ref="FILE" /> </appender> <!-- Logger配置部分,用于指定不同包或類的日志級(jí)別和輸出目的地 --> <!-- 針對(duì) com.example 包及其子包,設(shè)置日志級(jí)別為 INFO --> <logger name="com.example" level="INFO" /> <!-- 針對(duì) org.springframework 包及其子包,設(shè)置日志級(jí)別為 WARN --> <logger name="org.springframework" level="WARN" /> <!-- 針對(duì) org.hibernate.SQL 類,設(shè)置日志級(jí)別為 DEBUG,并關(guān)閉日志的追加性 --> <logger name="org.hibernate.SQL" level="DEBUG" additivity="false"> <!-- 只將該類的日志輸出到主文件Appender --> <appender-ref ref="FILE" /> </logger> <!-- Root Logger配置,是所有 Logger 的父 Logger,設(shè)置全局的日志級(jí)別和輸出目的地 --> <root level="INFO"> <!-- 將日志輸出到控制臺(tái)Appender --> <appender-ref ref="CONSOLE" /> <!-- 將日志異步輸出到主文件Appender --> <appender-ref ref="ASYNC_FILE" /> <!-- 將 ERROR 級(jí)別的日志輸出到錯(cuò)誤日志Appender --> <appender-ref ref="ERROR_FILE" /> </root> </configuration>
6.2 生產(chǎn)環(huán)境配置 (logback-spring-prod.xml)
<?xml version="1.0" encoding="UTF-8"?> <!-- Logback 配置文件的根標(biāo)簽,所有配置項(xiàng)都需包含在其中 --> <configuration> <!-- 使用 springProperty 標(biāo)簽從 Spring 上下文中獲取屬性值。 scope="context" 表示從 Spring 上下文獲取屬性, name="appName" 定義了屬性名, source="spring.application.name" 指定從 Spring 配置中獲取名為 spring.application.name 的屬性值, defaultValue="myApp" 若未獲取到屬性值,則使用默認(rèn)值 myApp --> <springProperty scope="context" name="appName" source="spring.application.name" defaultValue="myApp"/> <!-- 定義日志存儲(chǔ)的主目錄屬性,路徑為 /var/log/ 加上前面獲取的應(yīng)用名稱 --> <property name="LOG_HOME" value="/var/log/${appName}" /> <!-- 定義日志輸出的格式模式,包含日期時(shí)間、線程名、日志級(jí)別、日志記錄器名稱和日志消息 --> <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" /> <!-- 異步文件輸出 Appender 配置,將日志異步寫入文件以提高性能 --> <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender"> <!-- 異步隊(duì)列的大小,即最多可緩存的日志事件數(shù)量為 512 --> <queueSize>512</queueSize> <!-- 丟棄閾值,設(shè)置為 0 表示不丟棄日志事件 --> <discardingThreshold>0</discardingThreshold> <!-- 引用名為 FILE 的 Appender,將異步處理后的日志發(fā)送到該 Appender --> <appender-ref ref="FILE" /> </appender> <!-- 主日志文件 Appender 配置,用于將日志寫入文件并支持滾動(dòng)策略 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 指定日志文件的路徑,使用前面定義的日志主目錄 --> <file>${LOG_HOME}/application.log</file> <!-- 編碼器配置,將日志事件轉(zhuǎn)換為指定格式的字符串 --> <encoder> <!-- 使用前面定義的日志格式模式 --> <pattern>${LOG_PATTERN}</pattern> </encoder> <!-- 滾動(dòng)策略配置,基于文件大小和時(shí)間進(jìn)行滾動(dòng) --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 滾動(dòng)后的文件命名模式,包含日期和序號(hào) --> <fileNamePattern>${LOG_HOME}/application.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 單個(gè)日志文件的最大大小,超過此大小將進(jìn)行滾動(dòng) --> <maxFileSize>50MB</maxFileSize> <!-- 保留的歷史日志文件的最大天數(shù) --> <maxHistory>30</maxHistory> <!-- 所有日志文件的總大小上限 --> <totalSizeCap>5GB</totalSizeCap> </rollingPolicy> </appender> <!-- 錯(cuò)誤日志異步輸出 Appender 配置,將錯(cuò)誤日志異步寫入文件 --> <appender name="ASYNC_ERROR_FILE" class="ch.qos.logback.classic.AsyncAppender"> <!-- 異步隊(duì)列的大小,即最多可緩存的日志事件數(shù)量為 512 --> <queueSize>512</queueSize> <!-- 丟棄閾值,設(shè)置為 0 表示不丟棄日志事件 --> <discardingThreshold>0</discardingThreshold> <!-- 引用名為 ERROR_FILE 的 Appender,將異步處理后的錯(cuò)誤日志發(fā)送到該 Appender --> <appender-ref ref="ERROR_FILE" /> </appender> <!-- 錯(cuò)誤日志文件 Appender 配置,專門用于記錄錯(cuò)誤日志并支持滾動(dòng)策略 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 指定錯(cuò)誤日志文件的路徑,使用前面定義的日志主目錄 --> <file>${LOG_HOME}/error.log</file> <!-- 過濾器配置,只允許 ERROR 及以上級(jí)別的日志通過 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <!-- 設(shè)置過濾級(jí)別為 ERROR --> <level>ERROR</level> </filter> <!-- 編碼器配置,將日志事件轉(zhuǎn)換為指定格式的字符串 --> <encoder> <!-- 使用前面定義的日志格式模式 --> <pattern>${LOG_PATTERN}</pattern> </encoder> <!-- 滾動(dòng)策略配置,基于文件大小和時(shí)間進(jìn)行滾動(dòng) --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 滾動(dòng)后的文件命名模式,包含日期和序號(hào) --> <fileNamePattern>${LOG_HOME}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 單個(gè)錯(cuò)誤日志文件的最大大小,超過此大小將進(jìn)行滾動(dòng) --> <maxFileSize>50MB</maxFileSize> <!-- 保留的歷史錯(cuò)誤日志文件的最大天數(shù) --> <maxHistory>60</maxHistory> <!-- 所有錯(cuò)誤日志文件的總大小上限 --> <totalSizeCap>10GB</totalSizeCap> </rollingPolicy> </appender> <!-- 郵件通知 Appender 配置,當(dāng)出現(xiàn)錯(cuò)誤日志時(shí)發(fā)送郵件通知 --> <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender"> <!-- SMTP 服務(wù)器地址 --> <smtpHost>smtp.example.com</smtpHost> <!-- SMTP 服務(wù)器端口 --> <smtpPort>587</smtpPort> <!-- 發(fā)件人郵箱用戶名 --> <username>user@example.com</username> <!-- 發(fā)件人郵箱密碼 --> <password>password</password> <!-- 收件人郵箱地址 --> <to>admin@example.com</to> <!-- 發(fā)件人郵箱地址 --> <from>noreply@example.com</from> <!-- 郵件主題,包含應(yīng)用名稱、日志記錄器名稱和日志消息 --> <subject>${appName} - ERROR: %logger{20} - %m</subject> <!-- 郵件內(nèi)容布局配置 --> <layout class="ch.qos.logback.classic.PatternLayout"> <!-- 郵件內(nèi)容的格式模式,包含日期時(shí)間、線程名、日志級(jí)別、日志記錄器名稱、日志消息和異常信息 --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n%ex</pattern> </layout> <!-- 循環(huán)緩沖區(qū)跟蹤器配置,用于緩存一定數(shù)量的日志事件 --> <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker"> <!-- 緩沖區(qū)大小,即最多緩存 10 條日志事件 --> <bufferSize>10</bufferSize> </cyclicBufferTracker> </appender> <!-- Root Logger 配置,是所有 Logger 的父 Logger,設(shè)置全局的日志級(jí)別和輸出目的地 --> <root level="WARN"> <!-- 將日志異步輸出到主日志文件 Appender --> <appender-ref ref="ASYNC_FILE" /> <!-- 將錯(cuò)誤日志異步輸出到錯(cuò)誤日志文件 Appender --> <appender-ref ref="ASYNC_ERROR_FILE" /> <!-- 當(dāng)出現(xiàn)錯(cuò)誤日志時(shí),發(fā)送郵件通知 --> <appender-ref ref="EMAIL" /> </root> </configuration>
到此這篇關(guān)于Spring Boot集成Logback終極指南:從基礎(chǔ)到高級(jí)配置的文章就介紹到這了,更多相關(guān)Spring Boot集成Logback配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot集成logback打印彩色日志的代碼實(shí)現(xiàn)
- Spring Boot中集成各種日志框架Logback、Log4j2和Java Util Logging的步驟和示例代碼
- SpringBoot快速集成Logback日志組件
- SpringBoot3集成SLF4J+logback進(jìn)行日志記錄的實(shí)現(xiàn)
- 淺談spring boot 集成 log4j 解決與logback沖突的問題
- Spring Boot整合logback一個(gè)簡(jiǎn)單的日志集成架構(gòu)
- springboot項(xiàng)目配置logback-spring.xml實(shí)現(xiàn)按日期歸檔日志的方法
- IDEA?設(shè)置?SpringBoot?logback?彩色日志的解決方法?附配置文件
- 解決springboot配置logback-spring.xml不起作用問題
相關(guān)文章
SpringBoot中@Autowired注入service時(shí)出現(xiàn)循環(huán)依賴問題的解決方法
在Spring Boot開發(fā)過程中,@Autowired注入Service時(shí)出現(xiàn)循環(huán)依賴是一個(gè)常見問題,循環(huán)依賴指的是兩個(gè)或多個(gè)Bean相互依賴,形成閉環(huán),導(dǎo)致Spring容器無法正常初始化這些Bean,這里提供幾種解決Spring Boot中@Autowired注入Service時(shí)循環(huán)依賴問題的方法2024-02-02Mybatis插件+注解實(shí)現(xiàn)數(shù)據(jù)脫敏方式
這篇文章主要介紹了Mybatis插件+注解實(shí)現(xiàn)數(shù)據(jù)脫敏方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09Java設(shè)計(jì)模式之訪問模式(Visitor者模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之訪問模式(Visitor者模式)介紹,本文講解了為何使用Visitor模式、如何使用Visitor模式、使用Visitor模式的前提等內(nèi)容,需要的朋友可以參考下2015-03-03Intellij IDEA導(dǎo)入eclipse web項(xiàng)目的操作步驟詳解
Eclipse當(dāng)中的web項(xiàng)目都會(huì)有這兩個(gè)文件,但是idea當(dāng)中應(yīng)該是沒有的,所以導(dǎo)入會(huì)出現(xiàn)兼容問題,但是本篇文章會(huì)教大家如何導(dǎo)入,并且導(dǎo)入過后還能使用tomcat運(yùn)行,需要的朋友可以參考下2023-08-08java的Jackson框架實(shí)現(xiàn)輕易轉(zhuǎn)換JSON
本篇文章主要介紹了java的Jackson框架實(shí)現(xiàn)輕易轉(zhuǎn)換JSON,Jackson將Java對(duì)象轉(zhuǎn)換成json對(duì)象和xml文檔,同樣也可以將json、xml轉(zhuǎn)換成Java對(duì)象,有興趣的可以了解一下。2017-02-02Java報(bào)錯(cuò):找不到或無法加載主類的解決辦法
在Java中當(dāng)您嘗試運(yùn)行一個(gè)類作為主類時(shí),如果系統(tǒng)找不到該類或者無法加載該類,就會(huì)出現(xiàn)"找不到或無法加載主類"的錯(cuò)誤,這篇文章主要給大家介紹了關(guān)于Java報(bào)錯(cuò):找不到或無法加載主類的解決辦法,需要的朋友可以參考下2024-12-12