SpringBoot實(shí)現(xiàn)文件記錄日志及日志文件自動(dòng)歸檔和壓縮
1、什么是Logback
Logback
是一個(gè)Java日志框架,它是log4j
的后繼者,被廣泛用于應(yīng)用程序中記錄日志。
Logger(日志記錄器):
Logger
是 Logback 中最重要的組件之一。它負(fù)責(zé)收集應(yīng)用程序中的日志信息,并將其傳遞給適當(dāng)?shù)?Appender 進(jìn)行處理。Logger 使用不同的日志級(jí)別來(lái)決定日志信息的輸出方式。常見(jiàn)的日志級(jí)別有DEBUG、INFO、WARN、ERROR 和 TRACE
。
Appender(日志輸出目的地):Appender
決定日志信息的輸出目的地。Logback 提供了不同類型的 Appender,比如 ConsoleAppender、FileAppender 和 SocketAppender 等。每個(gè) Appender 可以配置不同的 Layout,用于定義日志信息的格式。
Logback 的日志輸出原理可以簡(jiǎn)單分為以下步驟:
- 應(yīng)用程序代碼中使用 Logger 記錄日志。Logger 根據(jù)日志級(jí)別決定是否將日志信息傳遞給 Appender。
- 當(dāng) Logger需要輸出日志時(shí),它會(huì)將日志信息封裝成一個(gè) LogEvent 對(duì)象。
- LogEvent 對(duì)象傳遞給配置好的 Appender。Appender 將根據(jù)配置將日志信息輸出到不同的目的地,比如控制臺(tái)、文件、遠(yuǎn)程服務(wù)器等。
- 在輸出日志之前,Appender 還會(huì)使用配置好的 Layout 對(duì)日志信息進(jìn)行格式化。
- 最終,格式化后的日志信息被輸出到指定的目的地,供開(kāi)發(fā)者和系統(tǒng)管理員查看和分析。
2、SpringBoot實(shí)現(xiàn)文件記錄日志,日志文件自動(dòng)歸檔和壓縮
2.1、配置
1、引入依賴
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
2、在 resource
目錄下 創(chuàng)建文件 logback-spring.xml
內(nèi)容如下
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="10 seconds"> <!--0. 日志格式和顏色渲染 --> <!-- 彩色日志依賴的渲染類 --> <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="log.path" value="./logs" /> <property name="app.name" value="eric" /> <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([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <!--1. 輸出到控制臺(tái)--> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!--此日志appender是為開(kāi)發(fā)使用,只配置最底級(jí)別,控制臺(tái)輸出的日志級(jí)別是大于或等于此級(jí)別的日志信息--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <encoder> <Pattern>${CONSOLE_LOG_PATTERN}</Pattern> <!-- 設(shè)置字符集 --> <charset>UTF-8</charset> </encoder> </appender> <!-- 2.2 level為 INFO 日志,時(shí)間滾動(dòng)輸出 --> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在記錄的日志文檔的路徑及文檔名 --> <file>${log.path}/${app.name}-info.log</file> <!--日志文檔輸出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> <!-- 日志記錄器的滾動(dòng)策略,按日期,按大小記錄 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 每天日志歸檔路徑以及格式 --> <fileNamePattern>${log.path}/${app.name}/${app.name}-info-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>10MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文檔保留天數(shù)--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文檔只記錄info級(jí)別的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.3 level為 WARN 日志,時(shí)間滾動(dòng)輸出 --> <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在記錄的日志文檔的路徑及文檔名 --> <file>${log.path}/${app.name}-warn.log</file> <!--日志文檔輸出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此處設(shè)置字符集 --> </encoder> <!-- 日志記錄器的滾動(dòng)策略,按日期,按大小記錄 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/${app.name}/${app.name}-warn-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>10MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文檔保留天數(shù)--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文檔只記錄warn級(jí)別的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.4 level為 ERROR 日志,時(shí)間滾動(dòng)輸出 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在記錄的日志文檔的路徑及文檔名 --> <file>${log.path}/${app.name}-error.log</file> <!--日志文檔輸出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此處設(shè)置字符集 --> </encoder> <!-- 日志記錄器的滾動(dòng)策略,按日期,按大小記錄 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/${app.name}/${app.name}-error-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>10MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文檔保留天數(shù)--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文檔只記錄ERROR級(jí)別的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- <logger name="org.springframework.web" level="WARN"/> <logger name="org.springframework.boot" level="WARN" /> <logger name="springfox.documentation.spring" level="WARN" /> <logger name="org.apache.shardingsphere" level="DEBUG" /> --> <!-- 開(kāi)發(fā)、測(cè)試環(huán)境 --> <springProfile name="dev,sit,test,uat"> <logger name="org.springframework.web" level="INFO"/> <logger name="org.springframework.boot" level="INFO" /> <logger name="springfox.documentation.spring" level="INFO" /> <logger name="ShardingSphere-SQL" level="INFO" /> <logger name="SQLStatement" level="INFO" /> <logger name="com.alibaba.nacos.client.naming" level="WARN" /> <logger name="org.apache.shardingsphere.core.route.SQLLogger" level="INFO" /> <logger name="com.zkj.lawfirm.platform" level="INFO" /> </springProfile> <!-- 生產(chǎn)環(huán)境--> <springProfile name="prod"> <logger name="org.springframework.web" level="WARN"/> <logger name="org.springframework.boot" level="WARN" /> <logger name="springfox.documentation.spring" level="WARN" /> <logger name="org.apache.shardingsphere" level="WARN" /> <logger name="ShardingSphere-SQL" level="WARN" /> <logger name="com.alibaba.nacos.client.naming" level="WARN" /> <logger name="org.apache.shardingsphere.core.route.SQLLogger" level="WARN" /> <logger name="com.zkj.lawfirm.platform" level="INFO" /> </springProfile> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="INFO_FILE" /> <appender-ref ref="WARN_FILE" /> <appender-ref ref="ERROR_FILE" /> </root> </configuration>
3、編寫一個(gè)控制器用來(lái)訪問(wèn)測(cè)試
package com.eric.springbootlog.demos.web; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @Controller @Slf4j public class BasicController { // http://127.0.0.1:8080/hello?name=lisi @RequestMapping("/hello") @ResponseBody public String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) { log.info("我是一條 info 日志"); return "Hello " + name; } }
2.2、日志記錄到文件中
此時(shí)我們啟動(dòng)項(xiàng)目,發(fā)現(xiàn)項(xiàng)目根目錄會(huì)自動(dòng)生成一個(gè) logs 目錄,發(fā)現(xiàn)日志已經(jīng)成功記錄到文件中了
此時(shí)我們?cè)僭L問(wèn)接口:http://127.0.0.1:8080/hello?name=lisi
發(fā)現(xiàn)日志成功打印,并且成功記錄到日志文件中
2.3、日志文件自動(dòng)歸檔和壓縮
因?yàn)槲以谂渲梦募幸呀?jīng)配置好了,此時(shí)我們?cè)偈謩?dòng)更換下電腦的時(shí)間,我這里修改到第二天
此時(shí)我們?cè)俅卧L問(wèn)接口:http://127.0.0.1:8080/hello?name=lisi
發(fā)現(xiàn)第二天的日志成功自動(dòng)歸檔,并且成為壓縮文件了~
總結(jié)
以上就是SpringBoot實(shí)現(xiàn)文件記錄日志及日志文件自動(dòng)歸檔和壓縮的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot日志文件歸檔和壓縮的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JVM加載class文件的原理機(jī)制實(shí)例詳解
Java是一種具有動(dòng)態(tài)性的解釋型語(yǔ)言,類(class)只有被加載到JVM后才能運(yùn)行,接下來(lái)通過(guò)本文給大家介紹JVM加載class文件的原理機(jī)制詳解,感興趣的朋友一起看看吧2022-04-04MyBatis-Plus中更新操作的兩種實(shí)現(xiàn)
本文主要介紹了MyBatis-Plus中更新操作的兩種實(shí)現(xiàn),主要是通過(guò)id更新和條件更新,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Java Stream 流實(shí)現(xiàn)合并操作示例
這篇文章主要介紹了Java Stream 流實(shí)現(xiàn)合并操作,結(jié)合實(shí)例形式詳細(xì)分析了Java Stream 流實(shí)現(xiàn)合并操作原理與相關(guān)注意事項(xiàng),需要的朋友可以參考下2020-05-05Java8加java10等于Java18的版本查看及特性詳解
這篇文章主要為大家介紹了Java?8加java10等于Java18的各個(gè)版本要點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Java?GenericObjectPool?對(duì)象池化技術(shù)之SpringBoot?sftp?連接池工具類詳解
這篇文章主要介紹了Java?GenericObjectPool?對(duì)象池化技術(shù)之SpringBoot?sftp?連接池工具類詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04jetty運(yùn)行時(shí)無(wú)法保存文件的解決方法
這篇文章主要為大家詳細(xì)介紹了jetty運(yùn)行時(shí)無(wú)法保存文件的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Spring Cloud中關(guān)于Feign的常見(jiàn)問(wèn)題總結(jié)
這篇文章主要給大家介紹了Spring Cloud中關(guān)于Feign的常見(jiàn)問(wèn)題,文中通過(guò)示例代碼介紹的很詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-02-02