1. 程式人生 > >SpringMVC下logback配置環境分離

SpringMVC下logback配置環境分離

摘要

最近開發過程中,使用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進行環境分離時可以使用上面的寫法進行配置,當然如果我們自己開發的測試專案,不需要進行環境的分離,使用上面這種配置也是可以的,而且在修改上面也會更加方便和清晰一些,有問題的地方也歡迎一起進行討論。