Spring Boot logback日誌配置
Spring Boot logback日誌配置
前言
SLF4J,即簡單日誌門面(Simple Logging Facade for Java)。從設計模式的角度考慮,它是用來在log和程式碼層之間起到門面的作用。配置SLF4J是非常簡單的一件事,只要將你打算使用的日誌系統對應的jar包加入到專案中,SLF4J就會自動選擇使用你加入的日誌系統。使用slf4j提供的介面,可隱藏日誌的具體實現。這與jdbc相似,使用jdbc也就避免了不同的具體資料庫。
SLF4J所提供的核心API是一些介面以及一個LoggerFactory的工廠類,SLF4J提供了統一的記錄日誌的介面,只要按照其提供的方法記錄即可,最終日誌的格式、記錄級別、輸出方式等通過具體日誌系統的配置來實現,因為在程式碼實現中用的是介面,因此可以在應用中靈活切換日誌系統。
目前來說,Logback是SLF4J的最佳實現。
對於Log4j , JDK logging, tinylog 等工具, 需要一個適配層, 把SLF4J 的API轉化成具體工具的呼叫介面。由於Logback這個工具直接實現了SLF4J的API,所以連適配層都不需要了, 用起來速度飛快,效率最高,SLFJ4+Logback 成為了很多人的最愛
預設日誌Logback
預設情況下,Spring Boot會用Logback來記錄日誌,並用INFO級別輸出到控制檯
但是呢,實際開發中我們不需要直接新增該依賴。 你會發現spring-boot-starter其中包含了
spring-boot-starter-logging,該依賴內容就是 Spring Boot 預設的日誌框架
logback。工程中有用到了Thymeleaf,而Thymeleaf依賴包含了spring-boot-starter,最終我只要引入Thymeleaf即可。
在新建的springboot專案或是開源專案執行時,就會看到日誌輸出:
這就是springboot預設的日誌輸出,檢視原始碼可知,預設配置為org/springframework/boot/logging/logback/base.xml的日誌配置:
//base.xml
<included>
<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" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</included>
// defaults.xml
<included>
# 定義顯示顏色
<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="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-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}}"/>
# 定義預設日誌檔案輸出格式
<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR" />
<logger name="org.apache.catalina.util.LifecycleBase" level="ERROR" />
<logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN" />
<logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN" />
<logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN" />
<logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR" />
<logger name="org.hibernate.validator.internal.util.Version" level="WARN" />
</included>
//console-appender.xml
<included>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
</included>
//file-appender.xml
<included>
<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.SizeAndTimeBasedRollingPolicy">
<!-- 新增.gz 歷史日誌會啟用壓縮 大大縮小日誌檔案所佔空間 -->
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
<maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>
</rollingPolicy>
</appender>
</included>
日誌級別
SpringBoot支援6種日誌級別(常用的只有四種),預設級別為INFO,比設定級別低的日誌資訊均不會輸出,按優先順序別排序如下:
TRACE
<DEBUG < INFO
<WARN
<ERROR
<FATAL
可以設定級別為DEBUG來啟用除錯模式(通常開發時使用),正常程式執行的每條日誌都會輸出
日誌輸出方式
預設情況下,Spring Boot將日誌輸出到控制檯,不會寫到日誌檔案
- 控制檯輸出,只在控制檯(console)中列印出日誌。
- 檔案輸出,將輸出的日誌儲存到檔案中。通常會自定義配置日誌輸出的檔案的儲存路徑,檔案命名格式,日誌格式等(更多時還需要區分日誌級別,每天產生一個日誌檔案等)。
自定義日誌配置
根據不同的日誌系統,你可以按如下規則組織配置檔名,就能被正確載入:
- Logback:logback-spring.xml, logback-spring.groovy, logback.xml,
logback.groovy - Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties,
log4j.xml Log4j2:log4j2-spring.xml, log4j2.xml - JDK (Java Util Logging):logging.properties
Spring Boot官方推薦優先使用帶有-spring的檔名作為你的日誌配置(如使用logback-spring.xml,而不是logback.xml),命名為logback-spring.xml的日誌配置檔案,spring boot可以為它新增一些spring boot特有的配置項
(下面會提到)。
預設的命名規則,並且放在 src/main/resources 下面即可
如果你即想完全掌控日誌配置,但又不想用logback.xml作為Logback配置的名字,application.yml/application.properties裡面可以通過logging.config屬性指定自定義的名字:
logging.config=file:config/logging-config.xml
這樣可以吧配置檔案放在config資料夾下統一管理
[admin@custmer-development-d-031162 salaxy_8074]$ ll
total 122148
-rw-r--r--. 1 admin admin 5 Aug 25 15:04 application.pid
-rw-r--r--. 1 admin admin 4 Aug 25 15:04 application.port
drwxr-xr-x. 2 admin admin 93 Aug 25 15:04 bak
drwxr-xr-x. 2 admin admin 93 Nov 18 23:48 config
-rwxr-xr-x. 1 admin admin 108 Aug 25 15:04 run.sh
-rw-r--r--. 1 admin admin 125064890 Aug 25 15:04 SpringBootdemo-2.0.jar
[admin@custmer-development-d-031162 salaxy_8074]$ ll config/
total 16
-rw-r--r--. 1 admin admin 10618 Aug 25 15:04 application-dev.properties
-rw-r--r--. 1 admin admin 1203 Aug 25 15:04 application.properties
-rw-r--r--. 1 admin admin 0 Nov 18 23:48 logback-spring.xml
示例一
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日誌儲存路徑,可以是絕對路徑,也可以是相對路徑,
logback會自動建立資料夾,這樣設定了就可以輸出日誌檔案了 -->
<substitutionProperty name="logbase" value="${LOG_PATH}"/>
<!-- 這個是要配置輸出檔案的 -->
<!-- ConsoleAppender 控制檯輸出日誌 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 對日誌進行格式化 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n</pattern>
</encoder>
</appender>
<!-- ERROR級別日誌 -->
<!-- 滾動記錄檔案,先將日誌記錄到指定檔案,當符合某個條件時,將日誌記錄到其他檔案 RollingFileAppender-->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 過濾器,只記錄WARN級別的日誌 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<!-- 最常用的滾動策略,它根據時間來制定滾動策略.既負責滾動也負責出發滾動 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日誌輸出位置 可相對、和絕對路徑 -->
<fileNamePattern>${logbase}%d{yyyy-MM-dd}/error%i.log</fileNamePattern>
<!--日誌最多保留5天,單個檔案最大20mb,該型別日誌檔案一共不能超過400mb-->
<MaxHistory>5</MaxHistory>
<maxFileSize>20MB</maxFileSize>
<totalSizeCap>400MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<!-- INFO級別日誌 appender -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 過濾器,只記錄INFO級別的日誌 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 按天回滾 daily -->
<fileNamePattern>${logbase}%d{yyyy-MM-dd}/info%i.log</fileNamePattern>
<MaxHistory>5</MaxHistory>
<maxFileSize>20MB</maxFileSize>
<totalSizeCap>400MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<!-- DEBUG級別日誌 appender -->
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 過濾器,只記錄DEBUG級別的日誌 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 按天回滾 daily -->
<fileNamePattern>${logbase}%d{yyyy-MM-dd}/debug%i.log</fileNamePattern>
<MaxHistory>5</MaxHistory>
<maxFileSize>20MB</maxFileSize>
<totalSizeCap>400MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<!-- root級別 info將會遮蔽debug級別的日誌 -->
<root level="info">
<!-- 控制檯輸出 -->
<appender-ref ref="STDOUT"/>
<!-- 檔案輸出 -->
<appender-ref ref="ERROR"/>
<appender-ref ref="INFO"/>
<appender-ref ref="DEBUG"/>
</root>
</configuration>
示例二
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<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" />
<!--<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%nseqId:%X{log_seqId}--${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>-->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSSZ} seqId : [%X{log_seqId}] %-5level %logger{20} - %msg%n</pattern>
</encoder>
<file>${LOG_PATH}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
<maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>
</rollingPolicy>
</appender>
<!-- 非同步輸出 -->
<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丟失日誌.預設的,如果佇列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日誌 -->
<discardingThreshold>20</discardingThreshold>
<!-- 更改預設的佇列的深度,該值會影響效能.預設值為256 -->
<queueSize>512</queueSize>
<!-- 新增附加的appender,最多隻能新增一個 -->
<appender-ref ref ="FILE"/>
</appender>
<logger name="org.apache.kafka.common.network" level="ERROR" additivity="false">
<appender-ref ref="FILE"/>
</logger>
<springProfile name="default">
<root>
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
<springProfile name="dev">
<root>
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ASYNC_FILE"/>
</root>
</springProfile>
</configuration>
示例三
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 配置IP地址 -->
<conversionRule conversionWord="ip" converterClass="com.xyk.util.log4j.IpConvert" />
<!-- Console 輸出格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="%date{yyyy-MM-dd HH:mm:ss} %boldGreen(%ip) | %highlight(%-5level) | %boldYellow(%thread) | %boldGreen(%logger) | %msg%n"/>
<!-- 檔案輸出格式 -->
<property name="FILE_LOG_PATTERN"
value="===%d{yyyy-MM-dd HH:mm:ss.SSS} %ip %-5level %logger Line:%-3L - %msg%n"/>
<!-- Console 輸出設定 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
${CONSOLE_LOG_PATTERN}
</pattern>
<charset>UTF-8</charset>
</encoder>
<!--此日誌appender是為開發使用,只配置最底級別,控制檯輸出的日誌級別是大於或等於此級別的日誌資訊-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
</appender>
<!--
說明:
1、日誌級別及檔案
日誌記錄採用分級記錄,級別與日誌檔名相對應,不同級別的日誌資訊記錄到不同的日誌檔案中
例如:error級別記錄到log_error_xxx.log或log_error.log(該檔案為當前記錄的日誌檔案),而log_error_xxx.log為歸檔日誌,
日誌檔案按日期記錄,同一天內,若日誌檔案大小等於或大於2M,則按0、1、2...順序分別命名
例如log-level-2013-12-21.0.log
其它級別的日誌也是如此。
2、檔案路徑
若開發、測試用,在Eclipse中執行專案,則到Eclipse的安裝路徑查詢logs資料夾,以相對路徑../logs。
若部署到Tomcat下,則在Tomcat下的logs檔案中
3、Appender
FILEERROR對應error級別,檔名以log-error-xxx.log形式命名
FILEWARN對應warn級別,檔名以log-warn-xxx.log形式命名
FILEINFO對應info級別,檔名以log-info-xxx.log形式命名
FILEDEBUG對應debug級別,檔名以log-debug-xxx.log形式命名
stdout將日誌資訊輸出到控制上,為方便開發測試使用
-->
<contextName>SpringBootDemo</contextName>
<property name="LOG_PATH" value="log/" />
<!--設定系統日誌目錄-->
<property name="APPDIR" value="pay-server" />
<!-- 日誌記錄器,日期滾動記錄 -->
<appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日誌檔案的路徑及檔名 -->
<file>${LOG_PATH}/${APPDIR}/log_error.log</file>
<!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 歸檔的日誌檔案的路徑,例如今天是2013-12-21日誌,當前寫的日誌檔案路徑為file節點指定,可以將此檔案與file指定檔案路徑設定為不同路徑,從而將當前日誌檔案或歸檔日誌檔案置不同的目錄。
而2013-12-21的日誌檔案在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日誌記錄之外,還配置了日誌檔案不能超過2M,若超過2M,日誌檔案會以索引0開始,
命名日誌檔案,例如log-error-2013-12-21.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 追加方式記錄日誌 -->
<append>true</append>
<!-- 日誌檔案的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日誌檔案只記錄error級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 日誌記錄器,日期滾動記錄 -->
<appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日誌檔案的路徑及檔名 -->
<file>${LOG_PATH}/${APPDIR}/log_warn.log</file>
<!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 歸檔的日誌檔案的路徑,例如今天是2013-12-21日誌,當前寫的日誌檔案路徑為file節點指定,可以將此檔案與file指定檔案路徑設定為不同路徑,從而將當前日誌檔案或歸檔日誌檔案置不同的目錄。
而2013-12-21的日誌檔案在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日誌記錄之外,還配置了日誌檔案不能超過2M,若超過2M,日誌檔案會以索引0開始,
命名日誌檔案,例如log-error-2013-12-21.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 追加方式記錄日誌 -->
<append>true</append>
<!-- 日誌檔案的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日誌檔案只記錄warn級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 日誌記錄器,日期滾動記錄 -->
<appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日誌檔案的路徑及檔名 -->
<file>${LOG_PATH}/${APPDIR}/log_info.log</file>
<!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 歸檔的日誌檔案的路徑,例如今天是2013-12-21日誌,當前寫的日誌檔案路徑為file節點指定,可以將此檔案與file指定檔案路徑設定為不同路徑,從而將當前日誌檔案或歸檔日誌檔案置不同的目錄。
而2013-12-21的日誌檔案在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日誌記錄之外,還配置了日誌檔案不能超過2M,若超過2M,日誌檔案會以索引0開始,
命名日誌檔案,例如log-error-2013-12-21.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 追加方式記錄日誌 -->
<append>true</append>
<!-- 日誌檔案的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日誌檔案只記錄info級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<logger name="org.springframework" level="WARN" />
<logger name="org.hibernate" level="WARN" />
<!-- 生產環境下,將此級別配置為適合的級別,以免日誌檔案太多或影響程式效能 -->
<!--這裡改level 生產環境改成ERROR 開發環境為INFO-->
<root level="INFO">
<appender-ref ref="FILEERROR" />
<appender-ref ref="FILEWARN" />
<appender-ref ref="FILEINFO" />
<!-- 生產環境將請stdout,testfile去掉 -->
<appender-ref ref="STDOUT" />
</root>
</configuration>
示例四
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextName>logback</contextName>
<springProperty scope="context" name="app_name" source="spring.application.name"/>
<springProfile name="test"><!-- 如果不同環境日誌存放路徑相同,無需套上springProfile節點 -->
<property name="log.path" value="D:\\test\\" /><!-- 可以放在.properties檔案裡配置 -->
</springProfile>
<springProfile name="prod">
<property name="log.path" value="D:\\prod\\" />
</springProfile>
<!-- 控制檯輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [${app_name:-}] [%thread] %-5level %logger{36} - %msg%n </pattern>
</encoder>
</appender>
<!-- 不帶過濾器,能記錄所有級別的日誌 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log.path}/info.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 策略在每次往日誌中新增新內容時觸發,如果滿足條件(每分鐘對應一個日誌檔案),就將
info.log複製到${log.path}目錄並更名為info-2017-11-22_13-15.1.log,並刪除原info.log,
另一種生成新檔案的條件是,info.log大小大於maxFileSize時,如果當前這一分鐘已經有一個檔案了,
則i加1。通常情況下,日誌按天分割,如:${log.path}/info-%d{yyyyMMdd}.%i.log -->
<fileNamePattern>${log.path}/info-%d{yyyy-MM-dd_HH-mm}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n </pattern>
</layout>
</appender>
<!-- error級別的檔案輸出 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<File>${log.path}/error.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error-%d{yyyy-MM-dd_HH-mm}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n </pattern>
</layout>
</appender>
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
<springProfile name="dev">
<logger name="com" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT" />
<!-- <appender-ref ref="INFO_FILE" />
<appender-ref ref="ERROR_FILE" /> -->
</logger>
</springProfile>
<springProfile name="test,prod">
<logger name="com" level="INFO" additivity="false">
<appender-ref ref="INFO_FILE" />
<appender-ref ref="ERROR_FILE" />
</logger>
</springProfile>
</configuration>
示例五
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<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="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-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}}"/>
<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
<logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
<logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
<logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
<logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
<logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
<logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<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.SizeAndTimeBasedRollingPolicy">
<!-- 新增.gz 歷史日誌會啟用壓縮 大大縮小日誌檔案所佔空間 -->
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
<maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>
</rollingPolicy>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
根節點包含的屬性
- scan:當此屬性設定為true時,配置檔案如果發生改變,將會被重新載入,預設值為true。
- scanPeriod:設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,預設單位是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘。
- debug:當此屬性設定為true時,將列印出logback內部日誌資訊,實時檢視logback執行狀態。預設值為false。
contextName設定上下文名稱
每個logger都關聯到logger上下文,預設上下文名稱為“default”。但可以使用設定成其他名字,用於區分不同應用程式的記錄。一旦設定,不能修改,可以通過%contextName來列印日誌上下文名稱,一般來說我們不用這個屬性,可有可無。
<property> 設定變數
用來定義變數值的標籤, 有兩個屬性,name和value;其中name的值是變數的名稱,value的值時變數定義的值。通過定義的值會被插入到logger上下文中。定義變數後,可以使“${}”來使用變數。
root節點是必選節點
用來指定最基礎的日誌輸出級別,只有一個level屬性。
level:用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設定為INHERITED或者同義詞NULL。
預設是DEBUG。
可以包含零個或多個元素,標識這個appender將會新增到這個loger。
控制檯輸出ConsoleAppender
日誌輸出到檔案RollingFileAppender
另一種常見的日誌輸出到檔案,隨著應用的執行時間越來越長,日誌也會增長的越來越多,將他們輸出到同一個檔案並非一個好辦法。RollingFileAppender用於切分檔案日誌:
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Info 級別的日誌,只是過濾 info 還是會輸出 Error 日誌,因為 Error 的級別高,
所以我們使用下面的策略,可以避免輸出 Error 的日誌-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--過濾 Error-->
<level>ERROR</level>
<!--匹配到就禁止-->
<onMatch>DENY</onMatch>
<!--沒有匹配到就允許-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<!--日誌名稱,如果沒有File 屬性,那麼只會使用FileNamePattern的檔案路徑規則
如果同時有<File>和<FileNamePattern>,那麼當天日誌是<File>,明天會自動把今天
的日誌改名為今天的日期。即,<File> 的日誌都是當天的。
-->
<File>${logback.logdir}/info.${logback.appname}.log</File>
<!--滾動策略,按照時間滾動 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--檔案路徑,定義了日誌的切分方式——把每一天的日誌歸檔到一個檔案中,以防止日誌填滿整個磁碟空間-->
<FileNamePattern>${logback.logdir}/info.${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--只保留最近90天的日誌-->
<maxHistory>90</maxHistory>
<!--用來指定日誌檔案的上限大小,那麼到了這個值,就會刪除舊的日誌-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日誌輸出編碼格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>
</encoder>
</appender>
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Error 級別的日誌,那麼需要過濾一下,預設是 info 級別的,ThresholdFilter-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>Error</level>
</filter>
<!--日誌名稱,如果沒有File 屬性,那麼只會使用FileNamePattern的檔案路徑規則
如果同時有<File>和<FileNamePattern>,那麼當天日誌是<File>,明天會自動把今天
的日誌改名為今天的日期。即,<File> 的日誌都是當天的。
-->
<File>${logback.logdir}/error.${logback.appname}.log</File>
<!--滾動策略,按照時間滾動 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--檔案路徑,定義了日誌的切分方式——把每一天的日誌歸檔到一個檔案中,以防止日誌填滿整個磁碟空間-->
<FileNamePattern>${logback.logdir}/error.${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--只保留最近90天的日誌-->
<maxHistory>90</maxHistory>
<!--用來指定日誌檔案的上限大小,那麼到了這個值,就會刪除舊的日誌-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日誌輸出編碼格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>
</encoder>
</appender>
encoder
表示對日誌進行編碼:
%d{HH: mm:ss.SSS}——日誌輸出時間
%thread——輸出日誌的程式名字,這在Web應用以及非同步任務處理中很有用
%-5level——日誌級別,並且使用5個字元靠左對齊
%logger{36}——日誌輸出者的名字
%msg——日誌訊息
%n——平臺的換行符
ThresholdFilter
系統定義的攔截器
我們用ThresholdFilter來過濾掉XXX level級別以下的日誌不輸出到檔案中。如果不用記得註釋掉,不然你控制檯會發現沒日誌~
loger
用來設定某一個包或者具體的某一個類的日誌列印級別、以及指定。僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。
name:用來指定受此loger約束的某一個包或者具體的某一個類。
level:用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。如果未設定此屬性,那麼當前loger將會繼承上級的級別。
addtivity:是否向上級loger傳遞列印資訊。預設是true。
appender
appender用來格式化日誌輸出節點,有倆個屬性name和class,class用來指定哪種輸出策略,常用就是控制檯輸出策略和檔案輸出策略。
參考博文(若侵刪):
https://blog.csdn.net/Inke88/article/details/75007649
http://blog.csdn.net/zhuyucheng123/article/details/21524529
https://blog.csdn.net/qq_22177809/article/details/82763085
相關文章
- Spring Boot 整合 Logback 日誌Spring Boot
- spring boot 日誌介紹 以及 logback配置示例Spring Boot
- spring boot使用logback實現多環境日誌配置Spring Boot
- Spring Boot日誌配置Spring Boot
- Spring boot日誌---slf4j+logbackSpring Boot
- Spring Boot 2 中的預設日誌管理與 Logback 配置詳解Spring Boot
- Spring Boot乾貨系列:(七)預設日誌logback配置解析 | 掘金技術徵文Spring Boot
- Spring Boot 中使用 LogBack 配置Spring Boot
- spring-boot-route(十六)使用logback生產日誌檔案Springboot
- Spring Boot 學習筆記(5):日誌配置Spring Boot筆記
- Spring Boot日誌使用Spring Boot
- Spring Boot與日誌Spring Boot
- 日誌工具logback的簡介與配置
- Spring Boot(十)Logback和Log4j2整合與日誌發展史Spring Boot
- Spring Boot日誌框架實踐Spring Boot框架
- Spring Boot中使用Loki日誌Spring BootLoki
- 【Spring】日誌列印sql,日誌配置列印sqlSpringSQL
- springboot logback配置mybatis 日誌以及多環境配置Spring BootMyBatis
- Java 日誌框架 LogbackJava框架
- springboot專案配置logback日誌系統Spring Boot
- 【Logback日誌級別】動態調整Logback的日誌級別
- logback 日誌輸出格式
- logback日誌元件使用案例元件
- springboot使用logback記錄日誌,配置檔案Spring Boot
- Spring Boot--日誌框架的學習Spring Boot框架
- ELK 處理 Spring Boot 日誌,不錯!Spring Boot
- Spring boot學習(六)Spring boot實現AOP記錄操作日誌Spring Boot
- Spring Boot 第三彈,一文帶你瞭解日誌如何配置?Spring Boot
- Logback詳細整理,基於springboot的日誌配置Spring Boot
- Java日誌框架:logback詳解Java框架
- Spring Boot:Spring Boot配置MybatisSpring BootMyBatis
- Logback配置檔案這麼寫,還愁不會整理日誌?
- springboot超級詳細的日誌配置(基於logback)Spring Boot
- 如何訪問Docker容器中的Spring Boot日誌DockerSpring Boot
- Spring Boot & 配置Spring Boot
- Spring Boot 入門(五):整合 AOP 進行日誌管理Spring Boot
- spring-boot-route(十七)使用aop記錄操作日誌Springboot
- spring boot更換日誌為log4j2Spring Boot