本文主要講解springboot項目下,如何通過修改一行配置文件,自由切換生產環境和開發環境logback的不同配置;
核心是解決了不同環境下由於對日誌記錄要求的不一樣(日誌級別、記錄形式等)而需要不同配置的情況下,方便我們自由切換配置內容(至於logback的核心配置,這裏不做贅述);
一、首先我們創建一個標準的maven項目,引入springboot的相關依賴,這裏不再贅述(可以參考https://blog.csdn.net/mayunju/article/details/78721107前半部分);
二、我們在src/main/resources下面創建4個文件,截圖如下:
三、這裏貼一下yml和logback-spring.xml與本分享相關的核心內容
application.yml:
spring:
# dev || prod
profiles:
active: prod
這裏通過配置profiles.active的值來切換使用-dev還是-prod的配置文件,但-dev和-prod的內容不再貼出,和本分享關係不大;
logback-spring.xml:
<!-- 開發環境 -->
<springProfile name="dev">
<!-- Root logger的定義 OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<root level="DEBUG" >
<appender-ref ref="CONSOLE-APPENDER" />
</root>
<!-- 以下是logger的定義 -->
<!-- 在控制檯輸出debug級別日誌 name屬性為dao層接口的路徑 ,生產環境不需要,開發環境調試用-->
<logger name="*.sys.mapper" level="DEBUG" />
</springProfile>
<!-- 生產環境 -->
<springProfile name="prod">
<!-- Root logger的定義 OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<root level="ERROR" >
<appender-ref ref="CONSOLE-APPENDER" />
<appender-ref ref="FILE-APPENDER" />
</root>
</springProfile>
重點是<springProfile>的name屬性值,這樣我們可以配置在不同的環境使用不用的appender,用於配置是僅僅將日誌信息打印到控制檯還是輸出的磁盤文件中,以及輸出不同級別的日誌等(這裏不做贅述);
四、核心分享到這裏已經完畢,下面貼一個完整的日誌配置文件,僅供參考
特別注意:如果使用 EvaluatorFilter 請在pom.xml引入以下依賴
<!-- logback EvaluatorFilter需要 -->
<!-- https://mvnrepository.com/artifact/org.codehaus.janino/janino -->
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>3.0.14</version>
</dependency>
比如下面貼的配置文件,我在生產環境的配置中過濾了兩個異常:
org.apache.catalina.connector.ClientAbortException和另一個我項目中自定義的異常類,不在日誌文件中記錄這兩個意義不大的異常信息,一般第一個異常都不需要記錄,是因爲客戶端主動放棄請求導致的;
logback-spring.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 日誌組件啓動時,打印調試信息,並監控此文件變化,週期120秒 -->
<!-- debug:當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false -->
<configuration scan="false" scanPeriod="120 seconds" debug="false">
<!-- 項目名稱及日誌目錄定義 -->
<property name="PROJECT_NAME" value="yourProjectName" />
<property name="FILE-APPENDER_LOG_LEVEL" value="WARN" />
<property name="LOG_PATH" value="../webapps/${PROJECT_NAME}-log/${FILE-APPENDER_LOG_LEVEL}" />
<!-- 每個logger都關聯到logger上下文,默認上下文名稱爲“default”。 但可以使用<contextName>設置成其他名字,用於區分不同應用程序的記錄。一旦設置,不能修改。 -->
<contextName>${PROJECT_NAME}</contextName>
<!-- 以下是appender的定義 -->
<!-- ConsoleAppender 記錄到控制檯,僅用於本地開發 -->
<!-- 本地開發環境只需要控制檯輸出,開發環境可刪除其他appender,只使用該appender -->
<appender name="CONSOLE-APPENDER" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}- [%contextName]- [%thread]- [%-5level]- [%logger{36}]- [%msg]- %n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 輸出到文件RollingFileAppender 生產環境一定需要-->
<!-- <Appender> 有多個過濾器時,按照配置順序執行 -->
<appender name="FILE-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 其中file屬性定義文件的帶全路徑的文件名 -->
<!--<file>${LOG_PATH}/${PROJECT_NAME}-warn.log</file>-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度,%msg:日誌消息,%n是換行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}- [%contextName]- [%thread]- [%-5level]- [%logger{36}]- [%msg] - %n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- rollingPolicy:當發生滾動時,決定 RollingFileAppender的行爲,涉及文件移動和重命名。 -->
<!-- TimeBasedRollingPolicy: 最常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責觸發滾動 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<FileNamePattern>${LOG_PATH}/${PROJECT_NAME}-warn.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!-- each file should be at most 100MB, keep 60 days worth of history, but at most 10GB -->
<maxFileSize>100MB</maxFileSize>
<maxHistory>60</maxHistory>
<!-- 來指定日誌文件的上限大小,例如設置爲10GB的話,那麼到了這個值,就會刪除舊的日誌 -->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<!-- ThresholdFilter: 臨界值過濾器,過濾掉所有低於warn級別的日誌。 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- 設置過濾級別 -->
<level>${FILE-APPENDER_LOG_LEVEL}</level>
</filter>
<filter class ="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator>
<expression>org.apache.catalina.connector.ClientAbortException.class.isInstance(throwable)</expression>
<expression>cn.**.common.exception.NoPermissionException.class.isInstance(throwable)</expression>
</evaluator>
<!-- 返回DENY,日誌將立即被拋棄不再經過其他過濾器 -->
<onMatch>DENY</onMatch>
</filter>
</appender>
<!-- 開發環境 -->
<springProfile name="dev">
<!-- Root logger的定義 OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<root level="DEBUG" >
<appender-ref ref="CONSOLE-APPENDER" />
</root>
<!-- 以下是logger的定義 -->
<!-- 在控制檯輸出debug級別日誌 name屬性為dao層接口的路徑 ,生產環境不需要,開發環境調試用-->
<logger name="cn.**.sys.mapper" level="DEBUG" /> <!-- 根據自己的項目配置合適的路徑 -->
</springProfile>
<!-- 生產環境 -->
<springProfile name="prod">
<!-- Root logger的定義 OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<root level="ERROR" >
<appender-ref ref="CONSOLE-APPENDER" />
<appender-ref ref="FILE-APPENDER" />
</root>
</springProfile>
</configuration>