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的級(jí)別-->
? ? ? ? ? ? <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的級(jí)別-->
? ? ? ? ? ? <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} 為我們?cè)诒O(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同級(jí)的目錄下生成一個(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)輸出的日志級(jí)別-->
<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)輸出的日志級(jí)別-->
<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)輸出的日志級(jí)別-->
<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">
<!--定義日志的級(jí)別,大于此級(jí)別才輸出日志-->
<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>
<!--根目錄日志級(jí)別是info-->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="FILE-ERROR" />
</root>
</configuration>
配置文件描述:
- ①配置文件有變動(dòng)自動(dòng)掃描,掃描周期是60秒。
- ②輸出的根目錄日志級(jí)別是info,日志文件配置了控制臺(tái)輸出,滾動(dòng)日志輸出,錯(cuò)誤日志輸出。
- ③根據(jù)spring不同的激活環(huán)境,日志的輸出目錄配置為不同的值;開發(fā)環(huán)境控制臺(tái)出入的級(jí)別為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)目激活的文件,定義對(duì)應(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),可以配置日志的級(jí)別和日志輸出的引用。
level:日志級(jí)別。appender-ref:日志追加的引用,配置ref值與appender標(biāo)簽關(guān)聯(lián)使用。
appender
定義日志追加的相關(guān)信息,name的值與appender-ref中的ref值對(duì)應(yīng)。
ConsoleAppender
控制臺(tái)輸出日志的類,存在于包c(diǎn)h.qos.logback.core.ConsoleAppender下,可以配置控制臺(tái)輸出的格式,日志級(jí)別。
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:日志級(jí)別的前五位字符。%logger{20}:輸出類名(從左開始縮短 ,每個(gè)層級(jí)至少保留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.HelloControllermsg:日志信息。
level級(jí)別
logback有5種級(jí)別,分別是Trace<Debug<Info<Warn<Error。
Trace:追蹤,就是程序推進(jìn)一下,你就可以寫個(gè)trace輸出。Debug:指出細(xì)粒度信息事件,對(duì)調(diào)試程序非常有幫助。Info:粗粒度級(jí)別上突出強(qiáng)調(diào)應(yīng)用程序的運(yùn)行過程。Warn:輸出警告及warn以下級(jí)別的日志。Error:輸出錯(cuò)誤信息日志。Off:關(guān)閉全部日志輸出。All:開啟全部日志輸出。
如果logger沒有分配日志級(jí)別,會(huì)從被分配級(jí)別最近的父類那里繼承級(jí)別,root logger默認(rèn)級(jí)別是Debug。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Kotlin基礎(chǔ)教程之控制流(順序,分支,循環(huán))
這篇文章主要介紹了Kotlin基礎(chǔ)教程之控制流的相關(guān)資料,需要的朋友可以參考下2017-05-05
SpringBoot實(shí)現(xiàn)WebSocket的示例代碼
這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)WebSocket的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11
SpringCloudStream中的消息分區(qū)數(shù)詳解
這篇文章主要介紹了SpringCloudStream中的消息分區(qū)數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Spring-AOP自動(dòng)創(chuàng)建代理之BeanNameAutoProxyCreator實(shí)例
這篇文章主要介紹了Spring-AOP自動(dòng)創(chuàng)建代理之BeanNameAutoProxyCreator實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(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ì),對(duì)大家的學(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
基于Feign傳輸對(duì)象無法接收參數(shù)的問題
這篇文章主要介紹了基于Feign傳輸對(duì)象無法接收參數(shù)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03

