如何修改覆蓋spring boot默認(rèn)日志策略logback詳解
背景
Spring Boot在所有內(nèi)部日志中使用Commons Logging,但是默認(rèn)配置也提供了對(duì)常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。每種Logger都可以通過(guò)配置使用控制臺(tái)或者文件輸出日志內(nèi)容。
默認(rèn)日志Logback
SLF4J——Simple Logging Facade For Java,它是一個(gè)針對(duì)于各類Java日志框架的統(tǒng)一Facade抽象。Java日志框架眾多——常用的有java.util.logging, log4j, logback,commons-logging, Spring框架使用的是Jakarta Commons Logging API (JCL)。而SLF4J定義了統(tǒng)一的日志抽象接口,而真正的日志實(shí)現(xiàn)則是在運(yùn)行時(shí)決定的——它提供了各類日志框架的binding。
Logback是log4j框架的作者開發(fā)的新一代日志框架,它效率更高、能夠適應(yīng)諸多的運(yùn)行環(huán)境,同時(shí)天然支持SLF4J。
默認(rèn)情況下,Spring Boot會(huì)用Logback來(lái)記錄日志,并用INFO級(jí)別輸出到控制臺(tái)。在運(yùn)行應(yīng)用程序和其他例子時(shí),你應(yīng)該已經(jīng)看到很多INFO級(jí)別的日志了。
springboot初始化了日志的默認(rèn)實(shí)現(xiàn),只要我們?cè)谂渲梦募砑訉?duì)應(yīng)的配置即可。
比如
logging: file: logs/application-debug.log pattern: console: "%d %-5level %logger : %msg%n" file: "%d %-5level [%thread] %logger : %msg%n" level: org.springframework.web: ERROR com.howtodoinjava: INFO org.hibernate: ERROR
可以指定日志文件名,覆蓋默認(rèn)的pattern,指定不同日志級(jí)別。
但依舊有很多局限性。比如,默認(rèn)的文件方案是:
E:\maven\repository\org\springframework\boot\spring-boot\1.5.13.RELEASE\spring-boot-1.5.13.RELEASE.jar!\org\springframework\boot\logging\logback\file-appender.xml
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> <file>${LOG_FILE}</file> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>${LOG_FILE}.%i</fileNamePattern> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender>
只是超過(guò)10m就生成一個(gè)新文件。而我們還遇到過(guò)日志把磁盤打滿的情況??隙ㄐ枰〞r(shí)清理,還想要按照日期生成文件。這樣,僅僅配置文件是不夠的,需要我們自己定義。
自定義
實(shí)現(xiàn)自定義就是在resource下新增logback-spring.xml, 然后編寫我們的配置方案。就是完全跳過(guò)spring的默認(rèn)配置了。但我又想偷懶,還想用spring的配置,但只是修改個(gè)別,比如file。
spring默認(rèn)配置文件 E:\maven\repository\org\springframework\boot\spring-boot\1.5.13.RELEASE\spring-boot-1.5.13.RELEASE.jar!\org\springframework\boot\logging\logback\base.xml
我們只要
<include resource="org/springframework/boot/logging/logback/base.xml"/>
就可以拿過(guò)來(lái)直接用。
最初我也是這樣做的,但后面發(fā)現(xiàn)有些東西是不能覆蓋的。比如內(nèi)置的日志文件名,所以,最后把base里的內(nèi)容單獨(dú)抽離出來(lái)用了。
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <springProperty scope="context" name="appName" source="spring.application.name" defaultValue="application"/> <springProperty scope="context" name="log.path" source="logging.path" defaultValue="logs"/> <springProperty scope="context" name="logstashurl" source="logstash.url" defaultValue="localhost:4560"/> <!--<include resource="org/springframework/boot/logging/logback/base.xml"/>--> <include resource="org/springframework/boot/logging/logback/defaults.xml" /> <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/> <include resource="org/springframework/boot/logging/logback/console-appender.xml" /> <!--輸出到文件--> <appender name="TIME_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">--> <!-- <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.log</fileNamePattern>--> <!-- <maxHistory>7</maxHistory>--> <!--</rollingPolicy>--> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- daily rollover --> <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxHistory>7</maxHistory> <maxFileSize>100MB</maxFileSize> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy> <encoder> <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${appName} %X{req.remoteHost} %X{req.requestURI} %X{req.userAgent} %X{req.method} - [%thread] %-5level %logger{36} - %msg%n</pattern>--> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> </appender> <!-- 輸出到logstash--> <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>${logstashurl}</destination> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/> </appender> <root level="INFO"> <appender-ref ref="CONSOLE"/> <appender-ref ref="TIME_FILE"/> </root> <springProfile name="dev"> <logger name="com.test.demo.mapper" level="DEBUG"> </logger> </springProfile> <springProfile name="local, test, prod"> <root level="warn"> <appender-ref ref="LOGSTASH"/> </root> </springProfile> </configuration>
同時(shí),需要讀取配置文件, 配置文件依舊生效
logging: path: logs file: ${logging.path}/${spring.application.name}
這里,include拿到spring默認(rèn)配置,但移除了base里的root配置,去掉了file。并自定義file。file規(guī)則是保存7天,每100m分一個(gè)文件,總大小不超過(guò)1G。
<springProperty scope="context" name="appName" source="spring.application.name" defaultValue="application"/> <springProperty scope="context" name="log.path" source="logging.path" defaultValue="logs"/> <springProperty scope="context" name="logstashurl" source="logstash.url" defaultValue="localhost:4560"/>
這一塊配置并沒(méi)有使用,只是放這里備份。logback里想要使用spring的配置文件的變量,只能通過(guò)這種方式讀取。因?yàn)槲遗渲昧薼ogstash,需要讀取logstash的url,所以這樣做。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- SpringBoot項(xiàng)目的logback日志配置(包括打印mybatis的sql語(yǔ)句)
- 基于logback 實(shí)現(xiàn)springboot超級(jí)詳細(xì)的日志配置
- Spring Boot異步輸出Logback日志方法詳解
- 詳解Spring Boot下使用logback 記錄多個(gè)文件日志
- 在SpringBoot中使用Logback管理記錄日志
- springboot使用logback文件查看錯(cuò)誤日志過(guò)程詳解
- 詳解Spring Boot配置使用Logback進(jìn)行日志記錄的實(shí)戰(zhàn)
- SpringBoot快速集成Logback日志組件
相關(guān)文章
Spring boot測(cè)試找不到SpringRunner.class的問(wèn)題
這篇文章主要介紹了Spring boot測(cè)試找不到SpringRunner.class的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01基于Java8并行流(parallelStream)的注意點(diǎn)
這篇文章主要介紹了Java8并行流(parallelStream)的注意點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot JSON全局日期格式轉(zhuǎn)換器實(shí)現(xiàn)方式
這篇文章主要介紹了SpringBoot JSON全局日期格式轉(zhuǎn)換器,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04Java實(shí)現(xiàn)公眾號(hào)功能、關(guān)注及消息推送實(shí)例代碼
公眾號(hào)開發(fā)近些年是一個(gè)比較熱門的方向,下面這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)公眾號(hào)功能、關(guān)注及消息推送的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11SpringBoot?實(shí)現(xiàn)CAS?Server統(tǒng)一登錄認(rèn)證的詳細(xì)步驟
??CAS(Central?Authentication?Service)中心授權(quán)服務(wù),是一個(gè)開源項(xiàng)目,目的在于為Web應(yīng)用系統(tǒng)提供一種可靠的單點(diǎn)登錄,這篇文章主要介紹了SpringBoot?實(shí)現(xiàn)CAS?Server統(tǒng)一登錄認(rèn)證,需要的朋友可以參考下2024-02-02Java Stopwatch類,性能與時(shí)間計(jì)時(shí)器案例詳解
這篇文章主要介紹了Java Stopwatch類,性能與時(shí)間計(jì)時(shí)器案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09Java Swing組件復(fù)選框JCheckBox用法示例
這篇文章主要介紹了Java Swing組件復(fù)選框JCheckBox用法,結(jié)合具體實(shí)例形式分析了Swing復(fù)選框JCheckBox簡(jiǎn)單用法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2017-11-11JAVA學(xué)習(xí)筆記:注釋、變量的聲明和定義操作實(shí)例分析
這篇文章主要介紹了JAVA學(xué)習(xí)筆記:注釋、變量的聲明和定義操作,結(jié)合實(shí)例形式分析了Java注釋、變量的聲明和定義相關(guān)原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04項(xiàng)目管理利器-Maven(Windows安裝)圖文教程
下面小編就為大家?guī)?lái)一篇項(xiàng)目管理利器-Maven(Windows安裝)圖文教程。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06詳解Mybatis逆向工程中使用Mysql8.0版本驅(qū)動(dòng)遇到的問(wèn)題
今天在使用 8.0.12 版的 mysql 驅(qū)動(dòng)時(shí)遇到了各種各樣的坑。這篇文章主要介紹了詳解Mybatis逆向工程中使用Mysql8.0版本驅(qū)動(dòng)遇到的問(wèn)題,感興趣的小伙伴們可以參考一下2018-10-10