欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Boot集成Logback終極指南之從基礎(chǔ)到高級(jí)配置實(shí)戰(zhàn)指南

 更新時(shí)間:2025年05月13日 17:16:26   作者:Clf丶憶笙  
Logback是一個(gè)可靠、通用且快速的Java日志框架,作為L(zhǎng)og4j的繼承者,由Log4j創(chuàng)始人設(shè)計(jì),這篇文章主要介紹了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-starterspring-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)值描述
scanbooleanfalse是否監(jiān)視配置文件變化
scanPeriod時(shí)間間隔1分鐘檢查配置文件變化的時(shí)間間隔
debugbooleanfalse是否打印Logback內(nèi)部調(diào)試信息
packagingDatabooleanfalse是否包含調(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)閉scandebug以避免性能開銷
  • 僅在需要診斷問題時(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.out
  • withJansi: 是否啟用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類型類名用途
SMTPAppenderch.qos.logback.classic.net.SMTPAppender通過郵件發(fā)送錯(cuò)誤日志
DBAppenderch.qos.logback.classic.db.DBAppender存儲(chǔ)日志到數(shù)據(jù)庫
SocketAppenderch.qos.logback.classic.net.SocketAppender通過網(wǎng)絡(luò)socket發(fā)送日志
SyslogAppenderch.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í)別
%loggerLogger名稱
%msg日志消息
%n換行符
%caller調(diào)用者信息
%mdcMDC內(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)整maxFileSizemaxHistory
  • 使用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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot中@Autowired注入service時(shí)出現(xiàn)循環(huá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-02
  • Mybatis插件+注解實(shí)現(xiàn)數(shù)據(jù)脫敏方式

    Mybatis插件+注解實(shí)現(xiàn)數(shù)據(jù)脫敏方式

    這篇文章主要介紹了Mybatis插件+注解實(shí)現(xiàn)數(shù)據(jù)脫敏方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Java設(shè)計(jì)模式之訪問模式(Visitor者模式)介紹

    Java設(shè)計(jì)模式之訪問模式(Visitor者模式)介紹

    這篇文章主要介紹了Java設(shè)計(jì)模式之訪問模式(Visitor者模式)介紹,本文講解了為何使用Visitor模式、如何使用Visitor模式、使用Visitor模式的前提等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • 解決maven加載依賴時(shí)遇到的問題

    解決maven加載依賴時(shí)遇到的問題

    這篇文章主要介紹了解決maven加載依賴時(shí)遇到的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Intellij IDEA導(dǎo)入eclipse web項(xiàng)目的操作步驟詳解

    Intellij 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-08
  • Netty的心跳檢測(cè)解析

    Netty的心跳檢測(cè)解析

    這篇文章主要介紹了Netty的心跳檢測(cè)解析,客戶端的心跳檢測(cè)對(duì)于任何長(zhǎng)連接的應(yīng)用來說,都是一個(gè)非常基礎(chǔ)的功能,要理解心跳的重要性,首先需要從網(wǎng)絡(luò)連接假死的現(xiàn)象說起,需要的朋友可以參考下
    2023-12-12
  • String.replaceAll方法詳析(正則妙用)

    String.replaceAll方法詳析(正則妙用)

    這篇文章主要給大家介紹了關(guān)于String.replaceAll方法,正則妙用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • java的Jackson框架實(shí)現(xiàn)輕易轉(zhuǎn)換JSON

    java的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-02
  • Java報(bào)錯(cuò):找不到或無法加載主類的解決辦法

    Java報(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
  • Java中map和flatMap的區(qū)別舉例詳解

    Java中map和flatMap的區(qū)別舉例詳解

    這篇文章主要給大家介紹了關(guān)于Java中map和flatMap區(qū)別的相關(guān)資料,在Java中Stream接口有map()和flatmap()方法,兩者都有中間流操作,并返回另一個(gè)流作為方法輸出,需要的朋友可以參考下
    2023-10-10

最新評(píng)論