springboot項(xiàng)目如何按天分割日志
引言
在大型分布式系統(tǒng)中,日志作為系統(tǒng)運(yùn)行狀態(tài)的重要記錄,其管理與分析對(duì)于故障排查、性能監(jiān)控和業(yè)務(wù)洞察具有至關(guān)重要的作用。
為了保證日志數(shù)據(jù)的有效組織與存儲(chǔ),按天分割日志成為一種常見的日志管理策略。
本文將詳細(xì)介紹如何在Spring Boot項(xiàng)目中利用Logback實(shí)現(xiàn)日志按天滾動(dòng),并探討相關(guān)配置技巧與最佳實(shí)踐。
一、Spring Boot日志體系概述
Spring Boot默認(rèn)集成了SLF4J作為日志門面,并推薦使用Logback作為其底層日志實(shí)現(xiàn)。
Logback以其高性能、靈活配置與豐富功能備受開發(fā)者青睞,尤其在日志切割、過(guò)濾、輸出等方面表現(xiàn)出色。
要實(shí)現(xiàn)按天分割日志,我們將主要圍繞Logback的配置文件logback-spring.xml或logback.xml展開。
二、按天分割日志原理與配置
日志滾動(dòng)策略
Logback通過(guò)RollingFileAppender支持日志文件的滾動(dòng)(rollover)。
當(dāng)滿足特定條件時(shí),如文件大小達(dá)到上限或到達(dá)某個(gè)時(shí)間點(diǎn),舊的日志文件會(huì)被關(guān)閉,新的日志文件被創(chuàng)建以繼續(xù)記錄日志。
我們要實(shí)現(xiàn)按天分割,就需要設(shè)置滾動(dòng)策略為基于時(shí)間。
配置示例
以下是一個(gè)典型的Logback配置片段,展示了如何設(shè)置按天滾動(dòng)的日志文件:
1.添加application.properties配置
log.path=logs log.level=info log.name=app
2.配置Logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:當(dāng)此屬性設(shè)置為true時(shí),配置文件如果發(fā)生改變,將會(huì)被重新加載,默認(rèn)值為true。
scanPeriod:設(shè)置監(jiān)測(cè)配置文件是否有修改的時(shí)間間隔,如果沒(méi)有給出時(shí)間單位,默認(rèn)單位是毫秒當(dāng)scan為true時(shí),此屬性生效。默認(rèn)的時(shí)間間隔為1分鐘。
debug:當(dāng)此屬性設(shè)置為true時(shí),將打印出logback內(nèi)部日志信息,實(shí)時(shí)查看logback運(yùn)行狀態(tài)。默認(rèn)值為false。
-->
<configuration scan="false" scanPeriod="60 seconds" debug="false">
<!-- 彩色日志 -->
<!-- 彩色日志依賴的渲染類 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%thread]){faint} %clr(%-40.40logger{39}){cyan} %clr([%L]) %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<!-- 定義日志文件的存儲(chǔ)地址,勿在logback配置文件中使用相對(duì)路徑.通過(guò)springProperty可以在properties文件設(shè)置相關(guān)path,level,name信息
application.properties中定義的變量,在logback的xml文件中無(wú)法直接讀取,必須要增加springProperty屬性中轉(zhuǎn)一下,source屬性里放的值是application.properties中定義的
-->
<springProperty name="log.path" source="log.path" />
<springProperty name="log.level" source="log.level" />
<springProperty name="log.name" source="log.name" />
<!-- 定義日志文件名格式化,定義到哪個(gè)維度則按哪個(gè)維度切割日志,只支持每周,每天,每個(gè)小時(shí),每分鐘等創(chuàng)建一個(gè)文件 yyyy-MM-dd-HH-mm 分鐘維度 -->
<property name="log.timeFormat" value="yyyy-MM-dd" />
<!-- 定義日志文件的輸出格式。%d表示日期,%thread表示線程名,%-5level:級(jí)別從左顯示5個(gè)字符寬度,%logger{50} 表示logger名字最長(zhǎng)50個(gè)字符,否則按照句點(diǎn)分割。%msg:日志消息,%n是換行符 -->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" />
<!-- 定義日志文件保留天數(shù),單位和log.timeFormat定義的最小維度保持一致,上面定義到天,則單位默認(rèn)為天 -->
<property name="log.maxHistory" value="30" />
<!-- 控制臺(tái)輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 滾動(dòng)記錄文件,先將日志記錄到指定文件,當(dāng)符合某個(gè)條件時(shí),將日志記錄到其他文件,并按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/${log.name}.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${log.level}</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 滾動(dòng)時(shí)產(chǎn)生的文件的存放位置及文件名稱 %d{yyyy-MM-dd}:按天進(jìn)行日志滾動(dòng)
%i:當(dāng)文件大小超過(guò)maxFileSize時(shí),按照i進(jìn)行文件滾動(dòng) 為了保證不重復(fù)
-->
<FileNamePattern>${log.path}/${log.name}.%d{${log.timeFormat}}.log</FileNamePattern>
<MaxHistory>${log.maxHistory}</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 日志輸出級(jí)別,root與logger是父子關(guān)系,沒(méi)有特別定義則默認(rèn)為root,任何一個(gè)類只會(huì)和一個(gè)logger對(duì)應(yīng),
要么是定義的logger,要么是root,判斷的關(guān)鍵在于找到這個(gè)logger,然后判斷這個(gè)logger的appender和level。 -->
<root level="${log.level}">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>上述配置中:
<file>標(biāo)簽指定了基礎(chǔ)日志文件名。
<rollingPolicy>標(biāo)簽設(shè)置了滾動(dòng)策略:
<fileNamePattern>決定了滾動(dòng)后新日志文件的命名規(guī)則,其中 %d{yyyy-MM-dd} 表示按天替換,生成的日志文件名將形如 app.2024-04-22.log。<maxHistory>限制了保留的歷史日志文件數(shù)量,此處設(shè)置為保留最近30天的日志。
<encoder>標(biāo)簽定義了日志輸出格式,可根據(jù)需要調(diào)整。
<root>標(biāo)簽將FILE appender應(yīng)用于全局日志記錄,級(jí)別為info及以上。
三、高級(jí)配置與優(yōu)化
- 按級(jí)別分離日志:除了按天分割,有時(shí)還需要將不同級(jí)別的日志(如INFO、ERROR)輸出到不同的文件。可以通過(guò)定義多個(gè)RollingFileAppender,分別配置不同的filter和fileNamePattern來(lái)實(shí)現(xiàn)。
- 壓縮與清理:為了節(jié)省磁盤空間,可以啟用日志文件壓縮。在TimeBasedRollingPolicy中添加<timeBasedFileNamingAndTriggeringPolicy>標(biāo)簽,并設(shè)置<compressionMode>為gzip。此外,可以使用第三方工具(如logrotate)定期清理過(guò)期的日志文件。
- 異步寫入:對(duì)于高并發(fā)場(chǎng)景,可以啟用AsyncAppender以異步方式寫入日志,減少同步寫入對(duì)主線程的影響。配置時(shí),將AsyncAppender作為中間層,引用實(shí)際的RollingFileAppender。
四、實(shí)踐中的注意事項(xiàng)
- 日志目錄權(quán)限:確保應(yīng)用運(yùn)行用戶對(duì)日志目錄有寫入權(quán)限,否則可能導(dǎo)致日志無(wú)法正確輸出或滾動(dòng)。
- 配置生效檢查:在修改Logback配置后,可通過(guò)重啟應(yīng)用或發(fā)送-Dlogback.debug=true啟動(dòng)參數(shù)來(lái)觀察日志輸出和滾動(dòng)行為,確保配置正確生效。
- 日志監(jiān)控與收集:結(jié)合日志管理系統(tǒng)(如ELK Stack、Sentry等)對(duì)按天分割的日志進(jìn)行集中收集、索引與分析,便于進(jìn)行實(shí)時(shí)監(jiān)控與歷史查詢。
總結(jié)
通過(guò)合理配置Logback,Spring Boot項(xiàng)目可以輕松實(shí)現(xiàn)日志按天分割,有效管理日志文件,既便于日常運(yùn)維,又有利于長(zhǎng)期存儲(chǔ)與分析。
掌握上述配置技巧與最佳實(shí)踐,有助于提升日志管理的效率與質(zhì)量,為系統(tǒng)的穩(wěn)定運(yùn)行與故障排查提供有力支持。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中JFinal框架動(dòng)態(tài)切換數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Java中JFinal框架動(dòng)態(tài)切換數(shù)據(jù)庫(kù)的方法,本文通過(guò)兩種方法結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
詳解java中this.getClass()和super.getClass()的實(shí)例
這篇文章主要介紹了詳解java中this.getClass()和super.getClass()的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-08-08
Java Guava排序器Ordering原理及代碼實(shí)例
這篇文章主要介紹了Java Guava排序器Ordering原理及代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
SpringBoot ApplicationContextAware拓展接口使用詳解
當(dāng)一個(gè)類實(shí)現(xiàn)了這個(gè)接口(ApplicationContextAware)之后,這個(gè)類就可以方便獲得ApplicationContext中的所有bean。換句話說(shuō),就是這個(gè)類可以直接獲取spring配置文件中,所有有引用到的bean對(duì)象2023-04-04
SpringCloud讓微服務(wù)實(shí)現(xiàn)指定程序調(diào)用
這篇文章主要介紹了SpringCloud讓微服務(wù)實(shí)現(xiàn)指定程序調(diào)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
SpringBoot項(xiàng)目Jar包使用systemctl運(yùn)行過(guò)程
這篇文章主要介紹了SpringBoot項(xiàng)目Jar包使用systemctl運(yùn)行過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
如何用java做一個(gè)word轉(zhuǎn)圖片的功能詳解
這篇文章主要給大家介紹了關(guān)于如何用java做一個(gè)word轉(zhuǎn)圖片的功能,通過(guò)實(shí)現(xiàn)Java Word轉(zhuǎn)圖片功能,避免PDF中間轉(zhuǎn)換損耗,涵蓋分頁(yè)處理、字體設(shè)置、性能優(yōu)化及替代方案對(duì)比,需要的朋友可以參考下2025-05-05
springboot整合kaptcha生成驗(yàn)證碼功能
這篇文章主要介紹了springboot整合kaptcha生成驗(yàn)證碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
淺談java中類名.class, class.forName(), getClass()的區(qū)別
下面小編就為大家?guī)?lái)一篇淺談java中類名.class, class.forName(), getClass()的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05

