logback日志控制服務(wù)器日志輸出過程
logback-spring.xml文件
一、確認(rèn)依賴(Spring Boot 默認(rèn)集成 Logback)
Spring Boot 默認(rèn)使用 Logback 作為日志框架,無需額外添加依賴。
若需自定義配置,可直接編寫配置文件。
二 配置 Logback(兩種方式)
通過 application.yml/properties 配置(簡潔版)
logging:
level:
root: INFO # 全局日志級別
com.example: DEBUG # 自定義包日志級別
file:
path: /var/log/app/ # Linux日志存儲路徑(需提前創(chuàng)建目錄)
pattern:
file: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" # 日志格式
# 滾動策略(按時間分割)
logback:
rollingpolicy:
file-name-pattern: /var/log/app/app-%d{yyyy-MM}.log.gz
max-history: 30 # 保留30天日志
方式二:自定義 Logback XML 配置文件(靈活版)
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
<!-- 日志格式 -->
<property name="LOG_PATH" value="/var/log/app/"/>
<property name="LOG_NAME" value="app"/>
<!-- 控制臺輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 滾動文件輸出(按時間分割) -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}${LOG_NAME}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}${LOG_NAME}-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap> <!-- 總占用空間 -->
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 錯誤日志單獨(dú)輸出 -->
<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>
<file>${LOG_PATH}${LOG_NAME}-error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}${LOG_NAME}-error-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 日志級別配置 -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
<appender-ref ref="ERROR_FILE"/>
</root>
<!-- 自定義包日志級別(如調(diào)試指定模塊) -->
<logger name="com.example" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</logger>
</configuration>
在application.yml中指定配置文件(可選,若文件名是logback-spring.xml則無需配置)
項(xiàng)目指定輸出日志格式 MDC使用
1 想要輸出指定日志格式:
[日志輸出時間戳] [全局ID] [父ID] [本地ID] [線程名] [日志級別] [tid值] [微服務(wù)托管主機(jī)名/IP] msg在代碼中定義的字段:[微服務(wù)IP及端口] [提供方微服務(wù)名稱或編號] [方法URL] [客戶端ip][行為場景] [操作主體] [操作類型] [操作對象] [處理結(jié)果] [region]
[2025-05-12 09:25:29.002] [VFeSsNbCSEefRlyvxSR5pg] [0] [VFeSsNbCSEefRlyvxSR5pg] [httpWorkerThread-8001-6] [INFO] [TID: N/A] [NZB23315479/11.204.8.24] [http://11.204.8.24:8001] [xx微服務(wù)/系統(tǒng)] [/log/sayHello] [11.204.8.24] [用戶行為][gushukuan] [賬號更新] [user1 name from張**to 李**;moible from 186****1234to 186****5431;idcard from 110***********3210 to 120***********7890] [成功] [0]
2 核心結(jié)論
- 通用字段(如全局 ID、用戶信息、客戶端 IP 等):建議通過攔截器(Interceptor)、過濾器(Filter)或 AOP 統(tǒng)一處理,避免在每個接口中重復(fù)賦值。
- 接口專屬字段(如操作對象、行為場景等):需要在具體接口中手動賦值(或通過業(yè)務(wù)邏輯層傳遞到 MDC)。
3 核心
- MDC 的核心作用是在同一線程的調(diào)用鏈中共享上下文信息(如日志字段),無需在方法參數(shù)中顯式傳遞,最終通過日志框架輸出到日志中
4 代碼配置
- %X{MDC變量}
<configuration>
<!-- 控制臺輸出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 定義日志格式,嚴(yán)格按需求順序排列字段 -->
<pattern>
[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%X{globalId}] [%X{parentId}] [%X{localId}] [%thread] [%level] [%X{tid}] [%hostName/%X{serverIp}] [%X{serviceUrl}] [%X{serviceName}] [%X{methodUrl}] [%X{clientIp}] [%X{scene}] [%X{operator}] [%X{operation}] [%msg] [%X{result}] [%X{region}]%n
</pattern>
</encoder>
</appender>
<!-- 根日志級別 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
5 映射區(qū)別
- %X{變量}:%X 用于訪問 MDC(Mapped Diagnostic Context,映射診斷上下文)中存放的鍵值對。MDC 是一個線程安全的集合,允許應(yīng)用程序在運(yùn)行時將自定義的診斷信息與日志記錄關(guān)聯(lián)起來。通過 %X{變量名} 可以獲取 MDC 中對應(yīng)變量名的值 。比如,在代碼中設(shè)置一些與請求相關(guān)的上下文信息(如請求 ID、用戶 ID 等),方便在日志中追蹤特定請求的處理情況。
- %hostName:%hostName 是 Logback 提供的一種內(nèi)置的轉(zhuǎn)換字,用于獲取當(dāng)前運(yùn)行日志程序的主機(jī)名 。它是 Logback 根據(jù)運(yùn)行環(huán)境直接獲取的固定信息,不需要手動在代碼中設(shè)置特定的上下文來賦值。
三、Linux 服務(wù)器部署注意事項(xiàng)
1. 創(chuàng)建日志目錄并設(shè)置權(quán)限
- 在Linux服務(wù)器創(chuàng)建日志目錄(需與配置中的路徑一致)
mkdir -p /var/log/app
- 賦予讀寫權(quán)限(假設(shè)應(yīng)用以tomcat用戶運(yùn)行)
chown -R tomcat:tomcat /var/log/app chmod -R 755 /var/log/app
2. 打包與啟動應(yīng)用
- 打包Spring Boot應(yīng)用
mvn clean package -DskipTests
- 上傳jar包到服務(wù)器并啟動
nohup java -jar app.jar > /dev/null 2>&1 &
- 查看日志
tail -f /var/log/app/app.log
3. 日志滾動與管理
- 自動分割:Logback 會按配置定期生成新日志文件,并壓縮舊文件(如app-2025-06-27.log.gz)。
- 手動清理:可添加定時任務(wù)(crontab)刪除過期日志:
每天凌晨1點(diǎn)清理60天前的日志
0 1 * * * find /var/log/app -name “*.log.gz” -mtime +60 -exec rm {} ;
四、常見問題與解決方案
日志文件未生成
- 檢查 Linux 路徑是否存在,應(yīng)用用戶是否有寫入權(quán)限(使用ls -la /var/log/app查看權(quán)限)。
- 確認(rèn)配置文件中的路徑是否與實(shí)際一致,可嘗試使用絕對路徑(如/home/app/logs/)。
日志級別未生效
- 檢查配置文件中l(wèi)evel是否正確,自定義包路徑是否匹配(如com.example需與項(xiàng)目包名一致)。
中文日志亂碼
在 Logback 配置中添加編碼設(shè)置:
UTF-8
…
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于SpringBoot和Vue3的博客平臺文章詳情與評論功能實(shí)現(xiàn)
在前面的教程中,我們已經(jīng)實(shí)現(xiàn)了基于Spring Boot和Vue3的發(fā)布、編輯、刪除文章功能以及文章列表與分頁功能。本教程將引導(dǎo)您實(shí)現(xiàn)博客平臺的文章詳情與評論功能,需要的朋友可以參考一下2023-04-04
詳解Java8如何使用Lambda表達(dá)式進(jìn)行比較
Lambda表達(dá)式,也可稱為閉包,是java8的新特性,作用是取代大部分內(nèi)部類,優(yōu)化java代碼結(jié)構(gòu),讓代碼變得更加簡潔緊湊。本文將利用Lambda表達(dá)式進(jìn)行排序比較,需要的可以參考一下2022-01-01
Java Integer[]和int[]互相轉(zhuǎn)換方式
這篇文章主要介紹了Java Integer[]和int[]互相轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
Spring?Boot開發(fā)RESTful接口與http協(xié)議狀態(tài)表述
這篇文章主要為大家介紹了Spring?Boot開發(fā)RESTful接口與http協(xié)議狀態(tài)表述,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
Spring Cloud Alibaba Nacos Config加載配置詳解流
這篇文章主要介紹了Spring Cloud Alibaba Nacos Config配置中心實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-07-07

