Springboot Logback日志多文件輸出方式(按日期和大小分割)
在早期的日志Slf4j+Log4j使用方式中,我們使用最多的就是LoggerFactory來獲取一個(gè)Logger實(shí)例,logback的原理也一樣。
本文示例文件分割按照日志大小和日期進(jìn)行分割。
配置logback.xml
配置需要的propery屬性
這部分可以配置到logback.properties 需要開啟掃描才行,下面是直接在logback.xml配置
<!--設(shè)置日志目錄-->
<property name="LOG_HOME" value="./applog"/>
<!--這里需要將value改成項(xiàng)目名稱-->
<property name="LOG_NAME" value="patrol-mobile-service"/>配置日志追加方式
配置appender標(biāo)簽包括文件生成規(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>
<!-- 文件日志策略:每天生成一個(gè)日志文件,保存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ū)分大小寫
<!--默認(rèn)日志級別,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF-->
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>配置日志模板
logger的配置就是LoggerFactory需要的模板,只有配置了工廠獲取才會(huì)生效。
<!--業(yè)務(wù)操作日志-->
<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 官方按大小和時(shí)間分隔規(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標(biāo)簽值為true默認(rèn)是false.
<!-- 文件日志策略:每天生成一個(gè)日志文件,保存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ù)前面介紹的一個(gè)完整配置示例
<configuration>
<!--設(shè)置日志目錄-->
<property name="LOG_HOME" value="./applog"/>
<!--這里需要將value改成項(xiàng)目名稱-->
<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>
<!-- 文件日志策略:每天生成一個(gè)日志文件,保存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>
<!-- 文件日志策略:每天生成多個(gè)日志文件-->
<!-- <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>-->
<!-- 【實(shí)時(shí)位置同步】文件日志策略:每天生成一個(gè)日志文件,保存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>
<!-- 【用戶事件同步】文件日志策略:每天生成一個(gè)日志文件,保存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>
<!-- 【用戶軌跡同步】件日志策略:每天生成一個(gè)日志文件,保存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>
<!-- 【事件附件同步】文件日志策略:每天生成一個(gè)日志文件,保存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)重啟服務(wù)】文件日志策略:每天生成一個(gè)日志文件,保存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服務(wù)】文件日志策略:每天生成一個(gè)日志文件,保存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>
<!--默認(rèn)日志級別,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF-->
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
<!--特定日志級別,其中xxx為項(xiàng)目名稱-->
<logger name="com.patrol.mobile.controller" level="info" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<!--業(yè)務(wù)操作日志-->
<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ù)自己項(xiàng)目的需要進(jìn)行自定義即可。
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: 巡護(hù)日志類型枚舉
*/
public enum PatrolLoggerType {
/**
* 重啟日志
*/
RESTART("RESTART_LOG"),
/**
* 實(shí)時(shí)位置
*/
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)啟動(dòng)日志示例
在Application啟動(dòng)類調(diào)用日志輸出。
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
/**
* 開啟定時(shí)任務(wù)調(diào)度
*/
@EnableScheduling
/**
* 開啟接口文檔描述
*/
@EnableSwagger2
/**
* @SpringBootApplication
* <p>相當(dāng)于@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);
}
}示例效果


總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot或SpringAI對接DeepSeek大模型的詳細(xì)步驟
- SpringBoot整合DeepSeek實(shí)現(xiàn)AI對話功能
- 在 Spring Boot 3 中接入生成式 AI的操作方法
- 解決創(chuàng)建springboot后啟動(dòng)報(bào)錯(cuò):Failed?to?bind?properties?under‘spring.datasource‘
- Springboot項(xiàng)目打包如何將依賴的jar包輸出到指定目錄
- Java調(diào)用ChatGPT(基于SpringBoot和Vue)實(shí)現(xiàn)可連續(xù)對話和流式輸出的ChatGPT API
- 在Spring Boot中使用Spark Streaming進(jìn)行實(shí)時(shí)數(shù)據(jù)處理和流式計(jì)算的步驟
- SpringBoot項(xiàng)目實(shí)現(xiàn)MyBatis流式查詢的教程詳解
- 使用Spring Boot輕松實(shí)現(xiàn)流式AI輸出的步驟
相關(guān)文章
Spring Data JPA 如何使用QueryDsl查詢并分頁
這篇文章主要介紹了Spring Data JPA 如何使用QueryDsl查詢并分頁,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
SpringBoot創(chuàng)建maven多模塊項(xiàng)目實(shí)戰(zhàn)代碼
本篇文章主要介紹了SpringBoot創(chuàng)建maven多模塊項(xiàng)目實(shí)戰(zhàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
Hibernate的Session_flush與隔離級別代碼詳解
這篇文章主要介紹了Hibernate的Session_flush與隔離級別代碼詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
TF-IDF理解及其Java實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了TF-IDF理解及其Java實(shí)現(xiàn)代碼實(shí)例,簡單介紹了tfidf算法及其相應(yīng)公式,然后分享了Java實(shí)現(xiàn)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
Spring IOC簡單理解及創(chuàng)建對象的方式
這篇文章主要介紹了Spring IOC簡單理解及創(chuàng)建對象的方式,本文通過兩種方式給大家介紹創(chuàng)建對象的方法,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09
Java使用JDK與Cglib動(dòng)態(tài)代理技術(shù)統(tǒng)一管理日志記錄
這篇文章主要介紹了Java使用JDK與Cglib動(dòng)態(tài)代理技術(shù)統(tǒng)一管理日志記錄,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
HandlerMapping之RequestMappingHandlerMapping作用詳解
這篇文章主要介紹了HandlerMapping之RequestMappingHandlerMapping作用詳解,HandlerMapping是用來尋找Handler的,并不與Handler的類型或者實(shí)現(xiàn)綁定,而是根據(jù)需要定義的,那么為什么要單獨(dú)給@RequestMapping實(shí)現(xiàn)一個(gè)HandlerMapping,需要的朋友可以參考下2023-10-10

