Spring整合logback以及其中遇到的坑
阿新 • • 發佈:2019-01-08
Spring整合logback
pom.xml
中新增logback相關依賴
<!-- slf4j + logback -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId >
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version >1.7.25</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>org.logback-extensions</groupId>
<artifactId>logback-ext-spring</artifactId>
<version>0.1.5</version>
</dependency>
logback基本配置檔案
在resources
下面建立logback.xml
檔案,logback框架會自動載入這個配置檔案。
<?xml version="1.0" encoding="UTF-8"?>
<!--
說明:
1、日誌級別及檔案
日誌記錄採用分級記錄,級別與日誌檔名相對應,不同級別的日誌資訊記錄到不同的日誌檔案中
例如:error級別記錄到log.error.xxx.log或log.error.log(該檔案為當前記錄的日誌檔案),而log.error.xxx.log為歸檔日誌,
日誌檔案按日期記錄,同一天內,若日誌檔案大小等於或大於10M,則按0、1、2...順序分別命名
例如log-level-2013-12-21.0.log
其它級別的日誌也是如此。
2、檔案路徑
若開發、測試用,在Eclipse中執行專案,則到Eclipse的安裝路徑查詢logs資料夾.
若部署到Tomcat下,則在Tomcat下的logs檔案中.
${catalina.base}能夠取到專案部署時候的tomcat目錄。
3、Appender
FILE-ERROR對應error級別,檔名以log.error.xxx.log形式命名
FILE-WARN對應warn級別,檔名以log.warn.xxx.log形式命名
FILE-INFO對應info級別,檔名以log.info.xxx.log形式命名
FILE-DEBUG對應debug級別,檔名以log.debug.xxx.log形式命名
STDOUT將日誌資訊輸出到控制檯上,為方便開發測試使用
-->
<!--
scan: 當此屬性設定為true時,配置檔案如果發生改變,將會被重新載入,預設值為true.
scanPeriod: 設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,預設單位是毫秒.當scan為true時,此屬性生效。預設的時間間隔為1分鐘.
debug: 當此屬性設定為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。預設值為false。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 在Eclipse中執行,請到Eclipse的安裝目錄中找log檔案,Tomcat下,請到Tomcat目錄下找 -->
<property name="LOG_PATH" value="${catalina.base}/logs"/>
<!-- 專案名稱 -->
<property name="PROJECT_NAME" value="spring-starter"/>
<!-- 控制檯列印日誌的配置 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %level ${PROJECT_NAME} [%thread] [%logger{50}:%line] %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<!-- 配置DEBUG, INFO, WARN, ERROR 日誌的Appender -->
<appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日誌檔案的路徑及檔名 -->
<file>${LOG_PATH}/${PROJECT_NAME}/${PROJECT_NAME}.log.error.log</file>
<!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 歸檔的日誌檔案的路徑,例如今天是2013-12-21日誌,當前寫的日誌檔案路徑為file節點指定,
可以將此檔案與file指定檔案路徑設定為不同路徑,從而將當前日誌檔案或歸檔日誌檔案置不同的目錄。
而2013-12-21的日誌檔案在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${PROJECT_NAME}/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日誌記錄之外,還配置了日誌檔案不能超過10M,若超過10M,日誌檔案會以索引0開始,
命名日誌檔案,例如log-error-2013-12-21.0.log -->
<maxFileSize>10MB</maxFileSize>
<!-- 日誌檔案保留天數 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 追加方式記錄日誌 -->
<append>true</append>
<!-- 日誌列印的格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %level ${PROJECT_NAME} [%thread] [%logger{50}:%line] %msg%n</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="FILE-WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日誌檔案的路徑及檔名 -->
<file>${LOG_PATH}/${PROJECT_NAME}/${PROJECT_NAME}.log.warn.log</file>
<!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 歸檔的日誌檔案的路徑,例如今天是2013-12-21日誌,當前寫的日誌檔案路徑為file節點指定,
可以將此檔案與file指定檔案路徑設定為不同路徑,從而將當前日誌檔案或歸檔日誌檔案置不同的目錄。
而2013-12-21的日誌檔案在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${PROJECT_NAME}/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日誌記錄之外,還配置了日誌檔案不能超過10M,若超過10M,日誌檔案會以索引0開始,
命名日誌檔案,例如log-warn-2013-12-21.0.log -->
<maxFileSize>10MB</maxFileSize>
<!-- 日誌檔案保留天數 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 追加方式記錄日誌 -->
<append>true</append>
<!-- 日誌列印的格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %level ${PROJECT_NAME} [%thread] [%logger{50}:%line] %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日誌檔案只記錄warn級別,不記錄大於warn級別的日誌 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日誌檔案的路徑及檔名 -->
<file>${LOG_PATH}/${PROJECT_NAME}/${PROJECT_NAME}.log.info.log</file>
<!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 歸檔的日誌檔案的路徑,例如今天是2013-12-21日誌,當前寫的日誌檔案路徑為file節點指定,
可以將此檔案與file指定檔案路徑設定為不同路徑,從而將當前日誌檔案或歸檔日誌檔案置不同的目錄。
而2013-12-21的日誌檔案在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${PROJECT_NAME}/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日誌記錄之外,還配置了日誌檔案不能超過10M,若超過10M,日誌檔案會以索引0開始,
命名日誌檔案,例如log-info-2013-12-21.0.log -->
<maxFileSize>10MB</maxFileSize>
<!-- 日誌檔案保留天數 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 追加方式記錄日誌 -->
<append>true</append>
<!-- 日誌列印的格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %level ${PROJECT_NAME} [%thread] [%logger{50}:%line] %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日誌檔案只記錄info級別,不記錄大於info級別的日誌 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="FILE-DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日誌檔案的路徑及檔名 -->
<file>${LOG_PATH}/${PROJECT_NAME}/${PROJECT_NAME}.log.debug.log</file>
<!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 歸檔的日誌檔案的路徑,例如今天是2013-12-21日誌,當前寫的日誌檔案路徑為file節點指定,
可以將此檔案與file指定檔案路徑設定為不同路徑,從而將當前日誌檔案或歸檔日誌檔案置不同的目錄。
而2013-12-21的日誌檔案在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${PROJECT_NAME}/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日誌記錄之外,還配置了日誌檔案不能超過10M,若超過10M,日誌檔案會以索引0開始,
命名日誌檔案,例如log-debug-2013-12-21.0.log -->
<maxFileSize>10MB</maxFileSize>
<!-- 日誌檔案保留天數 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 追加方式記錄日誌 -->
<append>true</append>
<!-- 日誌列印的格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %level ${PROJECT_NAME} [%thread] [%logger{50}:%line] %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日誌檔案只記錄debug級別,不記錄大於debug級別的日誌 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- SPRING等框架類程式碼日誌列印, 輸出到OTHER檔案中, 出廠預設WARN以上 -->
<appender name="OTHER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 此日誌檔案只記錄warn級別及其以上的 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
<!-- 正在記錄的日誌檔案的路徑及檔名 -->
<File>${LOG_PATH}/${PROJECT_NAME}/${PROJECT_NAME}.log.other.log</File>
<!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 歸檔的日誌檔案的路徑,例如今天是2013-12-21日誌,當前寫的日誌檔案路徑為file節點指定,
可以將此檔案與file指定檔案路徑設定為不同路徑,從而將當前日誌檔案或歸檔日誌檔案置不同的目錄。
而2013-12-21的日誌檔案在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${PROJECT_NAME}/log-other-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日誌記錄之外,還配置了日誌檔案不能超過10M,若超過10M,日誌檔案會以索引0開始,
命名日誌檔案,例如log-debug-2013-12-21.0.log -->
<maxFileSize>35MB</maxFileSize>
<!-- 日誌檔案保留天數 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 追加方式記錄日誌 -->
<append>true</append>
<!-- 日誌列印的格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %level ${PROJECT_NAME} [%thread] [%logger{50}:%line] %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<!--
出廠預設輸出level級別INFO, 排查問題時, 可以通過工具切換為TRACE.
自定義模組日誌列印 新增在後面.
name需要修改為自己專案中的合適的package
-->
<logger name="com.tao" level="INFO" additivity="false">
<appender-ref ref="FILE-ERROR" />
<appender-ref ref="FILE-WARN" />
<appender-ref ref="FILE-INFO" />
<appender-ref ref="FILE-DEBUG" />
<!-- 生產環境請將STDOUT去掉!!! -->
<appender-ref ref="STDOUT" />
</logger>
<!-- 其他的warn級別及其以上的日誌,通過OTHER來記錄 -->
<root level="WARN">
<appender-ref ref="OTHER" />
</root>
</configuration>
遇到的坑
報錯SLF4J: Class path contains multiple SLF4J bindings.
這個坑是今天遇到的最大的坑。
主要表現在slf4j無法繫結到logback,並且在tomcat的logs資料夾下面並沒有生成日誌檔案。
主要原因是activemq-all
依賴引起的。
解決辦法:不要使用activemq-all
依賴,改用activemq-spring
依賴或者一個一個引入activemq
相關的依賴包。
<!--
activemq相關依賴
注意:不要使用activemq-all, 如果專案使用的是logback日誌框架, 會導致和logback衝突, 無法載入logback配置!!!
可以使用activemq-spring整合包, 或者一個一個匯入需要的包.
-->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-spring</artifactId>
<version>${activemq-spring.version}</version>
</dependency>
<!--<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.13.0</version>
</dependency>-->
以後一定要多多注意有沒有某個依賴使用的是log4j
,與logback
發生衝突!!!