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)文章
Java設(shè)計(jì)模式之適配器模式的實(shí)現(xiàn)
這篇文章主要介紹了Java設(shè)計(jì)模式之適配器模式的實(shí)現(xiàn),適配器模式(Adapter Pattern)是作為兩個(gè)不兼容的接口之間的橋梁,這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它結(jié)合了兩個(gè)獨(dú)立接口的功能,需要的朋友可以參考下2023-11-11
關(guān)于@RequestParam的使用所遇到的404問題
這篇文章主要介紹了關(guān)于@RequestParam的使用所遇到的404問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Springboot線程池并發(fā)處理數(shù)據(jù)優(yōu)化方式
這篇文章主要介紹了Springboot線程池并發(fā)處理數(shù)據(jù)優(yōu)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java常見異常全面梳理(含分類+含義+典型場(chǎng)景)
異常是指程序在執(zhí)行過程中,出現(xiàn)的非正常情況,可能由程序員錯(cuò)誤、系統(tǒng)錯(cuò)誤或用戶輸入錯(cuò)誤引起,下面這篇文章主要介紹了Java常見異常全面梳理的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2026-03-03
Java使用elasticsearch基礎(chǔ)API使用案例講解
這篇文章主要介紹了Java使用elasticsearch基礎(chǔ)API使用案例講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
詳解Java接口簽名(Signature)實(shí)現(xiàn)方案
這篇文章主要介紹了Java接口簽名(Signature)實(shí)現(xiàn)方案?,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01

