SpringMVC下logback配置環境分離
阿新 • • 發佈:2019-01-07
摘要
最近開發過程中,使用Spring Profiles進行了開發環境與測試環境的分離,由於開發環境和測試環境之間需要使用不同的配置,例如開發環境和測試環境的日誌級別,日誌檔案儲存的路徑極有可能是不同的,所以需要將開發環境和測試環境分離開來,我們首先想到的可能是把logback.xml檔案拷貝成兩份,不同環境使用不同的logback.xml檔案不就可以了嗎?其實這樣是有問題的,一個是兩個logback.xml檔案進行管理是很頭疼的,另一個很重要的問題是logback.xml檔案會在web.xml檔案裡面配置,而web.xml檔案很難去判斷讀取哪一個logback.xml檔案。
解決方案
我們使用logback的一個特性,它提供<property resource=''>
來讀取我們的配置檔案,我們只需要在resource裡面配置好我們對應logback.properties的檔案路徑就可以了,例如這些:
<property resource="properties/${spring.profiles.active}/logback.properties"/>
這樣我們直接使用${spring.profiles.active}來獲取對應環境的目錄就可以了,非常方便。
實現程式碼
具體的實現程式碼如下:
- logback.xml基礎配置:
下面這段配置中主要配置的含義可以通過檢視logback文件去了解,不做過多的闡述,有兩個地方可以相應瞭解下,一個是日誌寫入檔案時,會同時按照日期和最大檔案大小生存新檔案,另一個是statusListener和debug=’false’可以不列印logback自身的日誌資訊。除了${spring.profiles.active}
${}
包裹的變數都是從logback.properties檔案中進行讀取的,所以我們需要在開發環境和生產環境分別定義一套logback.properties檔案:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<configuration scan="true" debug="false">
<property resource="properties/${spring.profiles.active}/logback.properties"/>
<!-- 清除logback狀態日誌 -->
<statusListener class="ch.qos.logback.core.status.NopStatusListener" />
<appender name="FILE-ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${_log.path}/${_file_name}.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${_file_level}</level> <!-- 過濾級別一下日誌 -->
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天滾動-->
<fileNamePattern>${_log.path}/${_file_name}.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 檔案超過20M時產生新檔案,這裡設定小於20M是因為logback存在緩衝區-->
<maxFileSize>${_max_file_size}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 每30天清除一次歷史 -->
<maxHistory>${_max_history}</maxHistory>
</rollingPolicy>
<!-- <layout class="ch.qos.logback.classic.html.HTMLLayout"> 可以按HTML格式輸出 -->
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<charset>UTF-8</charset>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${_file_pattern}</pattern>
</layout>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${_stdout_level}</level>
</filter>
<encoder>
<pattern>${_stdout_pattern}</pattern>
</encoder>
</appender>
<root level="${_root_level}">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE-ALL"/>
</root>
<logger name="org.apache" level="WARN"></logger>
<logger name="org.apache.ibatis" level="DEBUG"></logger>
<logger name="org.springframework" level="WARN"></logger>
<logger name="org.quartz" level="WARN"></logger>
<logger name="com.alibaba.druid" level="ERROR"></logger>
</configuration>
- logback.properties基礎配置:
普通的properties配置檔案,沒什麼好說的,類似的配置如下:
#日誌檔案路徑
_log.path=/Logs/backend
#輸出到日誌檔案級別,
_file_level=INFO
#輸出到日誌檔名稱,此時生成日誌檔案路徑類似於/Logs/backend/backend.log
_file_name=backend
#輸出到日誌檔案最大大小,超過20000KB時會產生新檔案
_max_file_size=20000KB
#日誌檔案允許存在最大天數
_max_history=60
#日誌檔案輸出格式
_file_pattern=%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{56}.%method:%L - %msg%n
#控制檯輸出級別,例如本地測試如果想列印sql,只需要把INFO修改成DEBUG級別
_stdout_level=ERROR
#控制檯輸出格式
_stdout_pattern=%date{HH:mm:ss.SSS} %-5level [%thread] %logger{56}.%method:%L - %msg%n
#根級別
_root_level=DEBUG
總結
logback進行環境分離時可以使用上面的寫法進行配置,當然如果我們自己開發的測試專案,不需要進行環境的分離,使用上面這種配置也是可以的,而且在修改上面也會更加方便和清晰一些,有問題的地方也歡迎一起進行討論。