Springboot Logback日志多文件輸出方式(按日期和大小分割)
在早期的日志Slf4j+Log4j使用方式中,我們使用最多的就是LoggerFactory來獲取一個Logger實例,logback的原理也一樣。
本文示例文件分割按照日志大小和日期進行分割。
配置logback.xml
配置需要的propery屬性
這部分可以配置到logback.properties 需要開啟掃描才行,下面是直接在logback.xml配置
<!--設置日志目錄--> <property name="LOG_HOME" value="./applog"/> <!--這里需要將value改成項目名稱--> <property name="LOG_NAME" value="patrol-mobile-service"/>
配置日志追加方式
配置appender標簽包括文件生成規(guī)則,內(nèi)容的輸出規(guī)則等
<!--控制臺日志格式--> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> </encoder> </appender> <!-- 文件日志策略:每天生成一個日志文件,保存30天的日志文件--> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/${LOG_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>30</maxHistory> <totalSizeCap>10GB</totalSizeCap> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> </encoder> </appender>
配置日志級別
注意:日志級別不區(qū)分大小寫
<!--默認日志級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF--> <root level="info"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> </root>
配置日志模板
logger的配置就是LoggerFactory需要的模板,只有配置了工廠獲取才會生效。
<!--業(yè)務操作日志--> <logger name="POSITION_LOG" level="info" additivity="false"> <appender-ref ref="POSITION_LOG_APPENDER"/> </logger> <logger name="EVENT_LOG" level="info" additivity="false"> <appender-ref ref="EVENT_LOG_APPENDER"/> </logger> <logger name="TRACK_LOG" level="info" additivity="false"> <appender-ref ref="TRACK_LOG_APPENDER"/> </logger> <logger name="FILE_LOG" level="info" additivity="false"> <appender-ref ref="FILE_LOG_APPENDER"/> </logger> <logger name="RESTART_LOG" level="info" additivity="false"> <appender-ref ref="RESTART_LOG_APPENDER"/> </logger>
logback 多日志文件操作
logback 官方按大小和時間分隔規(guī)則
http://logback.qos.ch/manual/appenders.html
<configuration> <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>mylog.txt</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- rollover daily --> <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern> <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB --> <maxFileSize>100MB</maxFileSize> <maxHistory>60</maxHistory> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>%msg%n</pattern> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="ROLLING" /> </root> </configuration>
日志未按照大小刪除和控制文件總大小
參考官方說明:http://logback.qos.ch/manual/appenders.html#TimeBasedRollingPolicy
需要配置:cleanHistoryOnStart標簽值為true默認是false.
<!-- 文件日志策略:每天生成一個日志文件,保存30天的日志文件--> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/${LOG_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>30</maxHistory> <totalSizeCap>10GB</totalSizeCap> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> </encoder> </appender>
logback完整示例配置
根據(jù)前面介紹的一個完整配置示例
<configuration> <!--設置日志目錄--> <property name="LOG_HOME" value="./applog"/> <!--這里需要將value改成項目名稱--> <property name="LOG_NAME" value="patrol-mobile-service"/> <!--控制臺日志格式--> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> </encoder> </appender> <!-- 文件日志策略:每天生成一個日志文件,保存30天的日志文件--> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/${LOG_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>30</maxHistory> <totalSizeCap>10GB</totalSizeCap> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> </encoder> </appender> <!-- 文件日志策略:每天生成多個日志文件--> <!-- <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}/${LOG_NAME}.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>${LOG_HOME}/${LOG_NAME}.%d{yyyy-MM-dd}.%i.zip</fileNamePattern> <minIndex>1</minIndex> <maxIndex>1000</maxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>100MB</maxFileSize> </triggeringPolicy> <encoder> <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender>--> <!-- 【實時位置同步】文件日志策略:每天生成一個日志文件,保存30天的日志文件--> <appender name="POSITION_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/${LOG_NAME}-position-sync.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>30</maxHistory> <totalSizeCap>10GB</totalSizeCap> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy> <!--僅輸出INFO日志--> <!--<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter>--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <!-- 接收INFO級別和高于INFO級別的日志--> <level>INFO</level> </filter> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> </encoder> </appender> <!-- 【用戶事件同步】文件日志策略:每天生成一個日志文件,保存30天的日志文件--> <appender name="EVENT_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/${LOG_NAME}-event-sync.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>30</maxHistory> <totalSizeCap>10GB</totalSizeCap> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy> <!--僅輸出INFO日志--> <!--<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter>--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <!-- 接收INFO級別和高于INFO級別的日志--> <level>INFO</level> </filter> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> </encoder> </appender> <!-- 【用戶軌跡同步】件日志策略:每天生成一個日志文件,保存30天的日志文件--> <appender name="TRACK_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/${LOG_NAME}-track-sync.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>30</maxHistory> <totalSizeCap>10GB</totalSizeCap> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy> <!--僅輸出INFO日志--> <!--<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter>--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <!-- 接收INFO級別和高于INFO級別的日志--> <level>INFO</level> </filter> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> </encoder> </appender> <!-- 【事件附件同步】文件日志策略:每天生成一個日志文件,保存30天的日志文件--> <appender name="FILE_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/${LOG_NAME}-file-sync.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>30</maxHistory> <totalSizeCap>10GB</totalSizeCap> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy> <!--僅輸出INFO日志--> <!--<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter>--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <!-- 接收INFO級別和高于INFO級別的日志--> <level>INFO</level> </filter> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> </encoder> </appender> <!-- 【系統(tǒng)重啟服務】文件日志策略:每天生成一個日志文件,保存30天的日志文件--> <appender name="RESTART_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/${LOG_NAME}-restart.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>30</maxHistory> <totalSizeCap>10GB</totalSizeCap> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy> <!--僅輸出INFO日志--> <!--<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter>--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <!-- 接收INFO級別和高于INFO級別的日志--> <level>INFO</level> </filter> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> </encoder> </appender> <!-- 【REDIS服務】文件日志策略:每天生成一個日志文件,保存30天的日志文件--> <appender name="REDIS_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/${LOG_NAME}-redis.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>30</maxHistory> <totalSizeCap>10GB</totalSizeCap> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy> <!--僅輸出INFO日志--> <!--<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter>--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <!-- 接收INFO級別和高于INFO級別的日志--> <level>INFO</level> </filter> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> </encoder> </appender> <!--默認日志級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF--> <root level="info"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> </root> <!--特定日志級別,其中xxx為項目名稱--> <logger name="com.patrol.mobile.controller" level="info" additivity="false"> <appender-ref ref="CONSOLE"/> </logger> <!--業(yè)務操作日志--> <logger name="POSITION_LOG" level="info" additivity="false"> <appender-ref ref="POSITION_LOG_APPENDER"/> </logger> <logger name="EVENT_LOG" level="info" additivity="false"> <appender-ref ref="EVENT_LOG_APPENDER"/> </logger> <logger name="TRACK_LOG" level="info" additivity="false"> <appender-ref ref="TRACK_LOG_APPENDER"/> </logger> <logger name="FILE_LOG" level="info" additivity="false"> <appender-ref ref="FILE_LOG_APPENDER"/> </logger> <logger name="RESTART_LOG" level="info" additivity="false"> <appender-ref ref="RESTART_LOG_APPENDER"/> </logger> <logger name="REDIS_LOG" level="info" additivity="false"> <appender-ref ref="REDIS_LOG_APPENDER"/> </logger> </configuration>
Java日志工具類
日志枚舉根據(jù)自己項目的需要進行自定義即可。
package com.patrol.beans.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @Copyright: 2019-2021 * @FileName: LoggerUtils.java * @Author: PJL * @Date: 2020/9/8 10:34 * @Description: 日志管理工具 */ public class LoggerUtils { /** * 打印到指定的文件下 * * @param patrolLoggerType 日志文件類型 * @return */ public static Logger getLogger(PatrolLoggerType patrolLoggerType) { return LoggerFactory.getLogger(patrolLoggerType.getLogFileName()); } /** * @Copyright: 2019-2021 * @FileName: PatrolLoggerType.java * @Author: PJL * @Date: 2020/9/8 10:10 * @Description: 巡護日志類型枚舉 */ public enum PatrolLoggerType { /** * 重啟日志 */ RESTART("RESTART_LOG"), /** * 實時位置 */ POSITION("POSITION_LOG"), /** * 用戶事件 */ EVENT("EVENT_LOG"), /** * 用戶軌跡 */ TRACK("TRACK_LOG"), /** * 事件附件 */ FILE("FILE_LOG"); private String logFileName; PatrolLoggerType(String fileName) { this.logFileName = fileName; } public String getLogFileName() { return logFileName; } } }
系統(tǒng)啟動日志示例
在Application啟動類調用日志輸出。
package com.patrol.mobile; import com.patrol.beans.util.LoggerUtils; import org.slf4j.Logger; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import springfox.documentation.swagger2.annotations.EnableSwagger2; import javax.annotation.PostConstruct; /** * 開啟異步請求 */ @EnableAsync /** * 開啟接口緩存 */ @EnableCaching /** * 開啟定時任務調度 */ @EnableScheduling /** * 開啟接口文檔描述 */ @EnableSwagger2 /** * @SpringBootApplication * <p>相當于@Configuration,@EnableAutoConfiguration和 @ComponentScan </p> */ @SpringBootApplication public class PatrolMobileServiceApplication { /** * 系統(tǒng)重啟日志輸出(指定日志文件輸出) */ @PostConstruct public void printLog() { Logger logger = LoggerUtils.getLogger(LoggerUtils.PatrolLoggerType.RESTART); logger.info(">>>系統(tǒng)重啟!"); } public static void main(String[] args) { SpringApplication.run(PatrolMobileServiceApplication.class, args); } }
示例效果
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- SpringBoot或SpringAI對接DeepSeek大模型的詳細步驟
- SpringBoot整合DeepSeek實現(xiàn)AI對話功能
- 在 Spring Boot 3 中接入生成式 AI的操作方法
- 解決創(chuàng)建springboot后啟動報錯:Failed?to?bind?properties?under‘spring.datasource‘
- Springboot項目打包如何將依賴的jar包輸出到指定目錄
- Java調用ChatGPT(基于SpringBoot和Vue)實現(xiàn)可連續(xù)對話和流式輸出的ChatGPT API
- 在Spring Boot中使用Spark Streaming進行實時數(shù)據(jù)處理和流式計算的步驟
- SpringBoot項目實現(xiàn)MyBatis流式查詢的教程詳解
- 使用Spring Boot輕松實現(xiàn)流式AI輸出的步驟
相關文章
Spring Data JPA 如何使用QueryDsl查詢并分頁
這篇文章主要介紹了Spring Data JPA 如何使用QueryDsl查詢并分頁,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11SpringBoot創(chuàng)建maven多模塊項目實戰(zhàn)代碼
本篇文章主要介紹了SpringBoot創(chuàng)建maven多模塊項目實戰(zhàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09Hibernate的Session_flush與隔離級別代碼詳解
這篇文章主要介紹了Hibernate的Session_flush與隔離級別代碼詳解,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02Spring IOC簡單理解及創(chuàng)建對象的方式
這篇文章主要介紹了Spring IOC簡單理解及創(chuàng)建對象的方式,本文通過兩種方式給大家介紹創(chuàng)建對象的方法,通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2021-09-09Java使用JDK與Cglib動態(tài)代理技術統(tǒng)一管理日志記錄
這篇文章主要介紹了Java使用JDK與Cglib動態(tài)代理技術統(tǒng)一管理日志記錄,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-05-05HandlerMapping之RequestMappingHandlerMapping作用詳解
這篇文章主要介紹了HandlerMapping之RequestMappingHandlerMapping作用詳解,HandlerMapping是用來尋找Handler的,并不與Handler的類型或者實現(xiàn)綁定,而是根據(jù)需要定義的,那么為什么要單獨給@RequestMapping實現(xiàn)一個HandlerMapping,需要的朋友可以參考下2023-10-10