SpringBoot應用自定義logback日志詳解
概述
默認情況下,SpringBoot內(nèi)部使用logback作為系統(tǒng)日志實現(xiàn)的框架,將日志輸出到控制臺,不會寫到日志文件。如果在application.properties或application.yml配置,這樣只能配置簡單的場景,保存路徑、日志格式等。復雜的場景(區(qū)分 info 和 error 的日志、每天產(chǎn)生一個日志文件等)滿足不了,只能自定義配置文件logback-spring.xml或者logback.xml。本篇文章主要講解下如何自定義logabck.xml以及對logback文件中配置做一個詳解。
logback配置詳解
首先我們先了解下logback。
logback 主要分為三個模塊:
- logback-core:是其他兩個模塊的基礎模塊
- logback-classic:是對 core 模塊的擴展,相當于 log4j 的改良版。classic 模塊實現(xiàn)了 Slf4j 的 API 因此可以便于和其他日志框架直接切換
- logback-access:與Servlet容器集成,以提供http訪問日志功能。
官網(wǎng)配置文檔地址:https://logback.qos.ch/manual/configuration.html
配置內(nèi)容概念介紹
Logger Context
LoggerContext負責制造logger,也負責以樹結構排列各logger。其他所有l(wèi)ogger也通過org.slf4j.LoggerFactory 類的靜態(tài)方法getLogger取得。 getLogger方法以 logger名稱為參數(shù)。
Logger
Logger作為日志的記錄器,把它關聯(lián)到應用的對應的context上后,主要用于存放日志對象,也可以定義日志類型、級別。
Appender
Appender主要用于指定日志輸出的目的地,目的地可以是控制臺、文件、遠程套接字服務器、 MySQL、PostreSQL、 Oracle和其他數(shù)據(jù)庫、 JMS和遠程UNIX Syslog守護進程等。
Layout
負責把事件轉(zhuǎn)換成字符串,格式化的日志信息的輸出。
配置介紹
配置文件的基本結構:以開頭,后面有零個或多個元素,有零個或多個元素,有最多一個元素。
默認配置的步驟
- 嘗試在 classpath下查找文件logback-test.xml;
- 如果文件不存在,則查找文件logback.xml;
- 如果兩個文件都不存在,logback用BasicConfigurator自動對自己進行配置,這會導致記錄輸出到控制臺。
<?xml version="1.0" encoding="UTF-8"?> <!-- scan:當此屬性設置為true時,配置文件如果發(fā)生改變,將會被重新加載,默認值為true。 scanPeriod:設置監(jiān)測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。 debug:當此屬性設置為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)。默認值為false。 --> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 運行環(huán)境,dev:開發(fā),test:測試,pre:預生產(chǎn),pro:生產(chǎn) --> <property name="system_host" value="dev" /> <property file="system.properties" /> <!-- 上下文變量設置,用來定義變量值,其中name的值是變量的名稱,value的值時變量定義的值。 通過<property>定義的值會被插入到logger上下文中。定義變量后,可以使“${}”來使用變量。 --> <property name="CONTEXT_NAME" value="logback-test" /> <!-- 日志文件存放路徑設置,絕對路徑 --> <property name="logs.dir" value="/opt/logs" /> <!-- 日志文件存放路徑設置,tomcat路徑 --> <property name="logs.dir" value="${catalina.base}/logs" /> <!-- 定義日志文件 相對輸入位置 --> <property name="log_dir" value="log" /> <!-- 日志輸出格式設置 --> <!-- %d{yyyy-MM-dd HH:mm:ss} [%level] - %msg%n Logger: %logger Class: %class File: %file Caller: %caller Line: %line Message: %m Method: %M Relative: %relative Thread: %thread Exception: %ex xException: %xEx nopException: %nopex rException: %rEx Marker: %marker newline:%n --> <property name="CUSTOM_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{90} - %msg%n" /> <!-- 上下文名稱:<contextName>, 每個logger都關聯(lián)到logger上下文, 默認上下文名稱為“default”。但可以使用<contextName>設置成其他名字,用于區(qū)分不同應用程序的記錄。 一旦設置,不能修改。 --> <contextName>${CONTEXT_NAME}</contextName> <!-- <appender>是<configuration>的子節(jié)點,是負責寫日志的組件。 有兩個必要屬性name和class。 name指定appender名稱, class指定appender的實現(xiàn)類。 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <!-- 對日志進行格式化。 --> <encoder> <pattern>${CUSTOM_LOG_PATTERN}</pattern> <charset>UTF-8</charset> </encoder> </appender> <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 按天來回滾,如果需要按小時來回滾,則設置為{yyyy-MM-dd_HH} --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>log/testC.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 如果按天來回滾,則最大保存時間為30天,30天之前的都將被清理掉 --> <maxHistory>30</maxHistory> <!-- 按時間回滾的同時,按文件大小來回滾 --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 過濾器,只記錄WARN級別的日志 --> <!-- 果日志級別等于配置級別,過濾器會根據(jù)onMath 和 onMismatch接收或拒絕日志。 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 設置過濾級別 --> <level>WARN</level> <!-- 用于配置符合過濾條件的操作 --> <onMatch>ACCEPT</onMatch> <!-- 用于配置不符合過濾條件的操作 --> <onMismatch>DENY</onMismatch> </filter> <!-- 日志輸出格式 --> <encoder> <pattern>${CUSTOM_LOG_PATTERN}</pattern> <charset>UTF-8</charset> </encoder> </appender> <appender name="log_file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創(chuàng)建,沒有默認值。 --> <file>${logs.dir}/logback-test.log</file> <!-- 按照固定窗口模式生成日志文件,當文件大于20MB時,生成新的日志文件。窗口大小是1到3,當保存了3個歸檔文件后,將覆蓋最早的日志 --> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <!-- 必須包含“%i”例如,假設最小值和最大值分別為1和2,命名模式為 mylog%i.log,會產(chǎn)生歸檔文件mylog1.log和mylog2.log。還可以指定文件壓縮選項,例如,mylog%i.log.gz 或者 沒有l(wèi)og%i.log.zip --> <FileNamePattern>${logs.dir}/logback-test.%i.log</FileNamePattern> <!-- 窗口索引最小值 --> <minIndex>1</minIndex> <!-- 窗口索引最大值 --> <maxIndex>3</maxIndex> </rollingPolicy> <!-- 日志級別過濾器 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 日志級別過濾器 --> <level>INFO</level> <!-- 符合要求的日志級別,過濾,ACCEPT:接受 --> <onMatch>ACCEPT</onMatch> <!-- 不符合要求的日志級別,過濾,DENY:拒絕 --> <onMismatch>DENY</onMismatch> </filter> <!-- 激活滾動的條件。 --> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <!-- 活動文件的大小,默認值是10MB --> <maxFileSize>30MB</maxFileSize> </triggeringPolicy> <!-- 對記錄事件進行格式化。 --> <encoder> <pattern>${CUSTOM_LOG_PATTERN}</pattern> <charset>UTF-8</charset> </encoder> </appender> <!-- 異步輸出 --> <appender name="ASYNC_logback" class="ch.qos.logback.classic.AsyncAppender"> <!-- 不丟失日志.默認的,如果隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日志 --> <!-- <discardingThreshold>0</discardingThreshold> --> <!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 --> <!-- <queueSize>256</queueSize> --> <!-- 添加附加的appender,最多只能添加一個 --> <appender-ref ref="log_file" /> </appender> <!-- 指定包輸出路徑 --> <!-- 用來設置某一個 包 或者具體的某一個 類 的日志打印級別、以及指定<appender>, name:用來指定受此logger約束的某一個包或者具體的某一個類。 level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執(zhí)行上級的級別。如果未設置此屬性,那么當前l(fā)oger將會繼承上級的級別。 additivity:是否向上級logger傳遞打印信息。默認是true。(這個logger的上級就是上面的root) <logger>可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個logger。 --> <logger name="org.logback.test" level="DEBUG" additivity="true"> <appender-ref ref="stdout" /> </logger> <!-- 特殊的<logger>元素,是根logger。只有一個level屬性,應為已經(jīng)被命名為"root". level:設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設置為INHERITED或者同義詞NULL。默認是DEBUG。 <root>可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個loger。 --> <root> <level value="WARN" /> <!-- if表達式,需要Janino jar --> <!-- Janino 2.6.0版本開始,除了janino.jar之外, commons-compiler.jar也需要在類路徑中 --> <if condition='property("system_host").contains("dev")'> <then> <appender-ref ref="stdout" /> </then> </if> <appender-ref ref="file" /> </root> </configuration>
SpringBoot中自定義logback
SpringBoot啟用自定義logback有3種方式:
- classpath下存在logback-spring.xml
- classpath下有l(wèi)ogback.xml
- 配置文件中通過配置項指定文件:
logging.config: ./logback-rule.xml
如果可能,我們建議您為日志記錄配置使用-spring變體或者通過配置項的方式(例如,logback-spring.xml而不是logback.xml)。如果使用標準配置,Spring不能完全控制日志初始化。
我們本例使用logback-spring.xml作為配置文件演示。
在 src/main/resources 下創(chuàng)建 logback-spring.xml 文件,分開記錄系統(tǒng)輸出日志和Error日志。
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <!--彩色日志輸出格式--> <property name="CONSOLE_LOG_PATTERN" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%level){blue} %clr(${PID}){magenta} %clr([%thread]){orange} %clr(%logger){cyan} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/> <!--非彩色日志輸出格式--> <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" /> <!--dev文件路徑:src同級目錄logs,如果上級目錄不存在會自動創(chuàng)建--> <property name="DEV_FILE_PATH" value="./logs" /> <!-- pro文件路徑 --> <property name="PRO_FILE_PATH" value="./logs-prod" /> <!-- 控制臺輸出 --> <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${CONSOLE_LOG_PATTERN}</pattern> </encoder> </appender> <!-- 按照每天生成輸出日志文件 --> <appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <encoder> <!--格式化輸出:%d表示日期,%thread表示線程,%-5level:級別從左顯示五個字符寬度,%logger{36}:logger是class的全名,后面的數(shù)字代表限制最長的字符,%msg:日志消息,%n換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> <!--滾動策略按照時間滾動--> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- rollover daily 文件名稱 --> <fileNamePattern>${DEV_FILE_PATH}/output-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- each file should be at most 10MB, keep 60 days worth of history, but at most 2GB --> <!--單個文件大小--> <maxFileSize>10MB</maxFileSize> <!--日志文件保留天數(shù)--> <maxHistory>60</maxHistory> <!--用來指定日志文件的上限大小,到了這個值就會刪除舊日志-->a <totalSizeCap>2GB</totalSizeCap> </rollingPolicy> </appender> <!-- 按照每天生成錯誤日志文件 --> <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 此日志文件只記錄ERROR級別的 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> <!--輸出日志到src同級目錄logs中的error.log文件中--> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--基于大小和時間的輪轉(zhuǎn)策略,當日志內(nèi)容超出文件大小限制后,會自動生成一個文件來繼續(xù)記錄和重命名--> <fileNamePattern>${DEV_FILE_PATH}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- each file should be at most 10MB, keep 60 days worth of history, but at most 2GB --> <maxFileSize>10MB</maxFileSize> <maxHistory>60</maxHistory> <totalSizeCap>2GB</totalSizeCap> </rollingPolicy> </appender> <root level="INFO"> <appender-ref ref="consoleAppender" /> <appender-ref ref="fileAppender" /> <appender-ref ref="errorAppender" /> </root> </configuration>
java中打印日志:
@SpringBootApplication @Slf4j public class LogbackApp { public static void main(String[] args) { SpringApplication.run(LogbackApp.class, args); log.trace("Trace 日志..."); log.debug("Debug 日志..."); log.info("Info 日志..."); log.warn("Warn 日志..."); log.error("Error 日志..."); } }
輸出結果:
SpringBoot官方建議使用logback-spring.xml作為logback框架的自定義日志配置文件,使用logback-spring.xml而不是logback.xml,因為帶-spring后綴的配置文件可以使用一些擴展的功能。
多環(huán)境輸出日志文件
Logback 配置文件中的 節(jié)點指令允許您根據(jù)配置文件激活參數(shù)(active) 選擇性的包含和排查部分配置信息。根據(jù)不同環(huán)境來定義不同的日志輸出,在 logback-spring.xml中使用 節(jié)點來定義,方法如下:
<!--開發(fā)環(huán)境:打印控制臺--> <springProfile name="dev"> <root level="DEBUG"> <appender-ref ref="consoleAppender" /> <appender-ref ref="fileAppender" /> <appender-ref ref="errorAppender" /> </root> </springProfile> <!--生產(chǎn)環(huán)境:輸出到文件--> <springProfile name="prod"> <root level="INFO"> <appender-ref ref="consoleAppender" /> <appender-ref ref="fileAppender" /> <appender-ref ref="errorAppender" /> </root> </springProfile>
配置文件添加配置項:
結果:
打印出了debug日志,說明dev的配置生效了。
讀取配置文件配置
本文通過讀取配置文件中的配置修改輸出的日志文件名來演示。
1.配置文件中添加配置項
2.logback-spring.xml中添加配置內(nèi)容如下:
<springProperty scope="context" name="logFileName" source="log.file.name" defaultValue="output"/>
- scope: 使用范圍
- name: 變量名
- source: 讀取的配置項名
- defaultValue: 默認名稱
3.通過${....}使用配置
4.結果,成功修改了輸出的日志文件名
文章代碼地址:https://github.com/alvinlkk/springboot-demo/tree/master/springboot-log-logback
以上就是SpringBoot應用自定義logback日志詳解的詳細內(nèi)容,更多關于SpringBoot應用自定義logback日志的資料請關注腳本之家其它相關文章!
相關文章
如何解決@PutMapping或@PostMapping接收String類型參數(shù)多兩個“引號問題
這篇文章主要介紹了如何解決@PutMapping或@PostMapping接收String類型參數(shù)多兩個“引號問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08常用數(shù)據(jù)庫的驅(qū)動程序及JDBC URL分享
這篇文章主要介紹了常用數(shù)據(jù)庫的驅(qū)動程序及 JDBC URL,需要的朋友可以看下2014-01-01詳解Spring Data JPA中Repository的接口查詢方法
repository代理有兩種方式從方法名中派生出特定存儲查詢:通過直接從方法名派生查詢和通過使用一個手動定義的查詢。本文將通過示例詳細講解Spring Data JPA中Repository的接口查詢方法,需要的可以參考一下2022-04-04springboot 實現(xiàn)Http接口加簽、驗簽操作方法
這篇文章主要介紹了springboot 實現(xiàn)Http接口加簽、驗簽操作,服務之間接口調(diào)用,通過簽名作為安全認證來保證API的安全性,本文結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-09-09idea配置多環(huán)境啟動方式dev、test、prod
這篇文章主要介紹了idea配置多環(huán)境啟動方式dev、test、prod,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09