logback之自定義指定日志文件存儲(chǔ)目錄方式
logback自定義指定日志文件存儲(chǔ)目錄
1、正常使用
定義一個(gè)logback.xml配置文件即可:
<?xml version="1.0" encoding="UTF-8" ?> ? <configuration> ? ? ? <!-- 指定日志文件路徑(與當(dāng)前程序jar包同一目錄下) --> ?? ?<property name="LOG_HOME" value="logs" /> ? ? ? <!--每天生成日志的類--> ? ? <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> ? ? ? ? <filter class="ch.qos.logback.classic.filter.LevelFilter"> ? ? ? ? ? ? <level>ERROR</level> ? <!--過濾掉error的級別--> ? ? ? ? ? ? <onMatch>DENY</onMatch> ? ? ? ? ? ? <onMismatch>ACCEPT</onMismatch> ? ? ? ? </filter> ? ? ? ? <encoder> ? ? ? ? ? ? <pattern> ? ? ? ? ? ? ? ? %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger - %msg%n ? ? ? ? ? ? </pattern> ? ? ? ? </encoder> ? ? ? ? <!--滾動(dòng)策略--> ? ? ? ? <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> ? ? ? ? ? ? <!--路徑--> ? ? ? ? ? ? <fileNamePattern>${LOG_HOME}/mds-tool-box-info.%d.log</fileNamePattern> ? ? ? ? </rollingPolicy> ? ? </appender> ? ? ? ? <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> ? ? ? ? <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> ? ? ? ? ? ? <level>ERROR</level> ?<!--//打印error--> ? ? ? ? </filter> ? ? ? ? <encoder> ? ? ? ? ? ? <pattern> ? ? ? ? ? ? ? ? %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger - %msg%n ? ? ? ? ? ? </pattern> ? ? ? ? </encoder> ? ? ? ? <!--滾動(dòng)策略--> ? ? ? ? <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> ? ? ? ? ? ? <!--路徑--> ? ? ? ? ? ? <fileNamePattern>${LOG_HOME}/mds-tool-box-error.%d.log</fileNamePattern> ? ? ? ? </rollingPolicy> ? ? </appender> ? ? ? <root level="info"> <!-- ? ? ? ?<appender-ref ref="consoleLog" />--> ? ? ? ? <appender-ref ref="fileInfoLog" /> ? ? ? ? <appender-ref ref="fileErrorLog" /> ? ? </root> ? </configuration>
2、自定義指定日志文件存儲(chǔ)目錄
2.1 定義監(jiān)聽器
/** ?* @version 1.0 ?* @class: CustomLogContextListener ?* @author: carlo ?* @mail: carlo_cwh@qq.com ?* @date: 2021/8/25 10:01 ?* @description: 定義logback 日志監(jiān)聽器,指定日志文件存放目錄 ?*/ public class CustomLogContextListener extends ContextAwareBase implements LoggerContextListener, LifeCycle { ? ? ? /** 存儲(chǔ)日志路徑標(biāo)識(shí) */ ? ? public static final String LOG_PAHT_KEY = "LOG_PATH"; ? ? ? @Override ? ? public boolean isResetResistant() { ? ? ? ? return false; ? ? } ? ? ? @Override ? ? public void onStart(LoggerContext loggerContext) { ? ? ? } ? ? ? @Override ? ? public void onReset(LoggerContext loggerContext) { ? ? ? } ? ? ? @Override ? ? public void onStop(LoggerContext loggerContext) { ? ? ? } ? ? ? @Override ? ? public void onLevelChange(Logger logger, Level level) { ? ? ? } ? ? ? @Override ? ? public void start() { ? ? ? ? // "user.dir"是指用戶當(dāng)前工作目錄 ? ? ? ? String s = System.getProperty("user.dir") + "/logs/"; ? ? ? ? System.setProperty(LOG_PAHT_KEY, s); ? ? ? ? Context context = getContext(); ? ? ? ? context.putProperty(LOG_PAHT_KEY, ?s); ? ? } ? ? ? @Override ? ? public void stop() { ? ? ? } ? ? ? @Override ? ? public boolean isStarted() { ? ? ? ? return false; ? ? } }
2.2 在logback.xml日志文件中指定監(jiān)聽器
<?xml version="1.0" encoding="UTF-8" ?> ? <configuration> ? ? ? <!-- 監(jiān)聽器,指定日志文件存放目錄 --> ? ? <contextListener class="com.hh.listener.CustomLogContextListener" /> ? ? ? <!--每天生成日志的類--> ? ? <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> ? ? ? ? <filter class="ch.qos.logback.classic.filter.LevelFilter"> ? ? ? ? ? ? <level>ERROR</level> ? <!--過濾掉error的級別--> ? ? ? ? ? ? <onMatch>DENY</onMatch> ? ? ? ? ? ? <onMismatch>ACCEPT</onMismatch> ? ? ? ? </filter> ? ? ? ? <encoder> ? ? ? ? ? ? <pattern> ? ? ? ? ? ? ? ? %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger - %msg%n ? ? ? ? ? ? </pattern> ? ? ? ? </encoder> ? ? ? ? <!--滾動(dòng)策略--> ? ? ? ? <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> ? ? ? ? ? ? <!--路徑--> ? ? ? ? ? ? <fileNamePattern>${LOG_PATH}/mds-tool-box-info.%d.log</fileNamePattern> ? ? ? ? </rollingPolicy> ? ? </appender> ? ? ? ? <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> ? ? ? ? <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> ? ? ? ? ? ? <level>ERROR</level> ?<!--//打印error--> ? ? ? ? </filter> ? ? ? ? <encoder> ? ? ? ? ? ? <pattern> ? ? ? ? ? ? ? ? %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger - %msg%n ? ? ? ? ? ? </pattern> ? ? ? ? </encoder> ? ? ? ? <!--滾動(dòng)策略--> ? ? ? ? <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> ? ? ? ? ? ? <!--路徑--> ? ? ? ? ? ? <fileNamePattern>${LOG_PATH}/mds-tool-box-error.%d.log</fileNamePattern> ? ? ? ? </rollingPolicy> ? ? </appender> ? ? ? <root level="info"> <!-- ? ? ? ?<appender-ref ref="consoleLog" />--> ? ? ? ? <appender-ref ref="fileInfoLog" /> ? ? ? ? <appender-ref ref="fileErrorLog" /> ? ? </root> ? </configuration>
其中 ${LOG_PATH} 為我們在監(jiān)聽器中定義的 key 值
logback基本配置說明
logback繼承自log4j,它是spring boot默認(rèn)的日志集成框架,官網(wǎng)地址:https://logback.qos.ch/
spring boot默認(rèn)日志框架
當(dāng)我們啟動(dòng)spring boot項(xiàng)目的時(shí)候,沒有進(jìn)行任何日志的配置,控制臺(tái)能輸出日志,原因是spring boot內(nèi)置了org.springframework.boot.logging.logback日志,里面配置了base.xml文件,引入了基礎(chǔ)的日志輸出格式。
當(dāng)我們項(xiàng)目部署到服務(wù)器后,會(huì)在與jar同級的目錄下生成一個(gè)默認(rèn)日志文件,文件名為jar包的名稱。
自定義logback配置文件
默認(rèn)的日志文件,生成的日志格式配置不是我們所希望的,默認(rèn)日志輸出格式:
此時(shí)我們可以自定義logback配置文件,默認(rèn)的日志文件名為logback.xml,spring官方首推的默認(rèn)日志文件名為logback-spring.xml;若是我們想命名為其他的名稱,也是可以的,在properties或者yml配置文件中指明下日志路徑和名稱即可:
logging: config: classpath:logback-xxx.xml
日志文件統(tǒng)一放在目錄:src/resources之下。
配置文件說明
先來看一個(gè)完整的配置文件:
<?xml version="1.0" encoding="utf-8" ?> <!--自動(dòng)掃描配置文件,間隔周期是60秒,不打印logback的內(nèi)部日志信息--> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!--根據(jù)spring激活的配置文件定義不同的屬性--> <springProfile name="local"> <!--local環(huán)境,日志的存放位置--> <property name="LOG_HOME" value="/Users/work/tools/logs/xxx" /> <!--local環(huán)境,控制臺(tái)輸出的日志級別--> <property name="CONSOLE_LEVEL" value="INFO" /> </springProfile> <springProfile name="dev"> <!--dev環(huán)境,日志的存放位置--> <property name="LOG_HOME" value="/u01/logs/xxx" /> <!--pro環(huán)境,控制臺(tái)輸出的日志級別--> <property name="CONSOLE_LEVEL" value="OFF" /> </springProfile> <springProfile name="pro"> <!--pro環(huán)境,日志的存放位置--> <property name="LOG_HOME" value="/u01/logs/xxx" /> <!--pro環(huán)境,控制臺(tái)輸出的日志級別--> <property name="CONSOLE_LEVEL" value="OFF" /> </springProfile> <!--日志存放最大數(shù)量--> <property name="maxHistory" value="30"/> <!--定義控制臺(tái)輸出的日志信息--> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!--把事件轉(zhuǎn)化成byte數(shù)組,并把數(shù)組輸出為文本--> <encoder> <!--定義輸出的日志格式--> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{20} -%msg%n</pattern> </encoder> <!--過濾輸出的日志--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <!--定義日志的級別,大于此級別才輸出日志--> <level>${CONSOLE_LEVEL}</level> </filter> </appender> <!--定義滾動(dòng)日志--> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--日志的存放名:目錄+文件名--> <file>${LOG_HOME}/auth-open.info.log</file> <encoder> <!--日志輸出格式--> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{20} -%msg%n</pattern> </encoder> <!--基于時(shí)間滾動(dòng)的日志--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--文件名的定義規(guī)則--> <fileNamePattern>${LOG_HOME}/auth-open.info.%d{yyyy-MM-dd}.log</fileNamePattern> <!--保存文件的最大記錄--> <maxHistory>${maxHistory}</maxHistory> </rollingPolicy> </appender> <!--錯(cuò)誤文件的滾動(dòng)配置--> <appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}/auth-open.error.log</file> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{20} -%msg%n</pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/auth-open.error.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>${maxHistory}</maxHistory> </rollingPolicy> </appender> <!--根目錄日志級別是info--> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> <appender-ref ref="FILE-ERROR" /> </root> </configuration>
配置文件描述:
- ①配置文件有變動(dòng)自動(dòng)掃描,掃描周期是60秒。
- ②輸出的根目錄日志級別是info,日志文件配置了控制臺(tái)輸出,滾動(dòng)日志輸出,錯(cuò)誤日志輸出。
- ③根據(jù)spring不同的激活環(huán)境,日志的輸出目錄配置為不同的值;開發(fā)環(huán)境控制臺(tái)出入的級別為info(與根目錄保持一致),線上環(huán)境和測試環(huán)境為off(不輸出日志,因?yàn)榭刂婆_(tái)輸出的日志與發(fā)布的jar包在同一目錄下,沒法進(jìn)行刪除,造成日志文件冗余)。
- ④以日期為滾動(dòng)文件的存儲(chǔ)策略,設(shè)置日志最大存儲(chǔ)量為30,大于30時(shí),自動(dòng)刪除創(chuàng)建是時(shí)間最早的日志。
configuration
configuration是最外層的配置,在其內(nèi)包含所有的配置信息。
scan
:當(dāng)配置文件發(fā)生變動(dòng)時(shí),是否自動(dòng)掃描配置信息,true:自動(dòng)掃描,false:不掃描。scanPeriod
:自動(dòng)掃描的時(shí)間周期,默認(rèn)是毫秒,當(dāng)scan為true時(shí)才有效。debug
:是否打印logback內(nèi)部日志信息,默認(rèn)是false。
springProfile
根據(jù)spring boot項(xiàng)目激活的文件,定義對應(yīng)的配置信息,用于區(qū)分同一變量在不同環(huán)境下的值。
name
:用于指定激活的配置文件,例如測試環(huán)境spring.profiles.active為dev,線上環(huán)境為pro,此時(shí)可以給不同的環(huán)境下同一變量設(shè)置不同的屬性值。property
:定義變量,name為后續(xù)引用的名稱,value為變量的值,后續(xù)可以使用${}引用此變量。
root
root為配置文件的根節(jié)點(diǎn),可以配置日志的級別和日志輸出的引用。
level
:日志級別。appender-ref
:日志追加的引用,配置ref值與appender標(biāo)簽關(guān)聯(lián)使用。
appender
定義日志追加的相關(guān)信息,name的值與appender-ref中的ref值對應(yīng)。
ConsoleAppender
控制臺(tái)輸出日志的類,存在于包c(diǎn)h.qos.logback.core.ConsoleAppender下,可以配置控制臺(tái)輸出的格式,日志級別。
RollingFileAppender
滾動(dòng)日志的類,存在于包c(diǎn)h.qos.logback.core.rolling.RollingFileAppender,可以滾動(dòng)存放日志信息。
RollingPolicy
滾動(dòng)日志的策略,可以根據(jù)時(shí)間滾動(dòng)TimeBasedRollingPolicy,時(shí)間和文件大小滾動(dòng)SizeAndTimeBasedRollingPolicy。
fileNamePattern
:滾動(dòng)文件名的表達(dá)式。maxHistory
:最大歷史記錄,當(dāng)大于最大歷史記錄時(shí),會(huì)刪除創(chuàng)建時(shí)間最早的一份日志記錄
encoder
- 把事件轉(zhuǎn)化成byte數(shù)組,并把數(shù)組輸出為文本。
pattern
- 輸出日志的格式表達(dá)式,例:
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{20} -%msg%n</pattern>
%d
:日期格式表達(dá)式,語法與SimpleDataFormat相同。%thread
:線程名。%-5level
:日志級別的前五位字符。%logger{20}
:輸出類名(從左開始縮短 ,每個(gè)層級至少保留1位),20位,例:
完整logger名 : cn.xbz.test.HelloController %logger : cn.xbz.test.HelloController %logger{0}: HelloController %logger{5}: c.x.t.HelloController %logger{20}: c.x.test.HelloController
msg
:日志信息。
level級別
logback有5種級別,分別是Trace<Debug<Info<Warn<Error。
Trace
:追蹤,就是程序推進(jìn)一下,你就可以寫個(gè)trace輸出。Debug
:指出細(xì)粒度信息事件,對調(diào)試程序非常有幫助。Info
:粗粒度級別上突出強(qiáng)調(diào)應(yīng)用程序的運(yùn)行過程。Warn
:輸出警告及warn以下級別的日志。Error
:輸出錯(cuò)誤信息日志。Off
:關(guān)閉全部日志輸出。All
:開啟全部日志輸出。
如果logger沒有分配日志級別,會(huì)從被分配級別最近的父類那里繼承級別,root logger默認(rèn)級別是Debug。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Kotlin基礎(chǔ)教程之控制流(順序,分支,循環(huán))
這篇文章主要介紹了Kotlin基礎(chǔ)教程之控制流的相關(guān)資料,需要的朋友可以參考下2017-05-05SpringBoot實(shí)現(xiàn)WebSocket的示例代碼
這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)WebSocket的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11SpringCloudStream中的消息分區(qū)數(shù)詳解
這篇文章主要介紹了SpringCloudStream中的消息分區(qū)數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Spring-AOP自動(dòng)創(chuàng)建代理之BeanNameAutoProxyCreator實(shí)例
這篇文章主要介紹了Spring-AOP自動(dòng)創(chuàng)建代理之BeanNameAutoProxyCreator實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07配置化Feign接口動(dòng)態(tài)切換URL方式
本文介紹了在開發(fā)、測試和生產(chǎn)環(huán)境中使用Feign接口時(shí),根據(jù)不同的環(huán)境動(dòng)態(tài)切換調(diào)用URL的方法,通過在不同環(huán)境的配置文件中配置URL,并實(shí)現(xiàn)一個(gè)Feign攔截器來讀取這些配置,從而實(shí)現(xiàn)URL的動(dòng)態(tài)切換,這種方法避免了引入過多步驟,同時(shí)也保證了不同環(huán)境下的URL正確調(diào)用2024-11-11如何實(shí)現(xiàn)java Iterator迭代器功能
這篇文章主要介紹了如何實(shí)現(xiàn)java Iterator迭代器功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01實(shí)例分析Java中public static void main(String args[])是什么意思
這篇文章主要介紹了實(shí)例分析Java中public static void main(String args[])的意義,詳細(xì)分析了Java主函數(shù)main關(guān)鍵字聲明的具體含義和用法,需要的朋友可以參考下2015-12-12