使用SpringBoot2.0搭建企業級應用開發框架(四)配置LogBack日誌
阿新 • • 發佈:2018-11-09
- 前言
SpringBoot預設配置提供了對常用日誌的支援,如:Java Util Logging、Log4J、Log4J2和Logback,每種Logger都可以通過配置使用控制檯或者檔案輸出日誌內容
Logback是log4j框架的作者開發的新一代日誌框架,它效率更高、能夠適應諸多的執行環境,同時天然支援slf4j,SpringBoot預設使用LogBack來記錄日誌,並用INFO級別輸出到控制檯
- 配置
在com/resources/下建立LogBack配置檔案logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?> <!--說明文件地址http://tengj.top/2017/04/05/springboot7/--> <!--scan: 當此屬性設定為true時,配置檔案如果發生改變,將會被重新載入,預設值為true。--> <!--scanPeriod: 設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,預設單位是毫秒。 當scan為true時,此屬性生效。預設的時間間隔為1分鐘。--> <!--debug: 當此屬性設定為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。預設值為false。--> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <property name="appName" value="demo"></property> <property name="logPath" value="/applog/logs/demoApplication/"></property> <!-- 彩色日誌格式 --> <property name="colorParttern" value="%d{HH:mm:ss.SSS} %contextName [%yellow(%thread)] %highlight(%-5level) %green(%logger){36} - %msg%n"></property> <property name="normalParttern" value="%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n"></property> <contextName>${appName}</contextName> <!--輸出到控制檯--> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <!--<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <!– 此appender是為開發使用,只配置最底級別,控制檯輸出的日誌級別是大於或等於此級別的日誌資訊 –> <level>DEBUG</level> </filter>--> <encoder> <pattern>${colorParttern}</pattern> </encoder> </appender> <!--INFO檔案--> <appender name="info_file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在記錄的日誌檔案的路徑及檔名 --> <file>${logPath}/logback_info.log</file> <!--日誌檔案輸出格式--> <encoder> <pattern>${normalParttern}</pattern> <charset>UTF-8</charset> <!-- 設定字符集 --> </encoder> <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logPath}/logback-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!--日誌檔案保留天數--> <maxHistory>30</maxHistory> <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </TimeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 此日誌檔案只記錄info級別的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!--WARN檔案--> <appender name="warn_file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在記錄的日誌檔案的路徑及檔名 --> <file>${logPath}/logback_warn.log</file> <!--日誌檔案輸出格式--> <encoder> <pattern>${normalParttern}</pattern> <charset>UTF-8</charset> <!-- 設定字符集 --> </encoder> <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logPath}/logback-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!--日誌檔案保留天數--> <maxHistory>30</maxHistory> <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </TimeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 此日誌檔案只記錄warn級別的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!--異常日誌檔案--> <appender name="error_file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在記錄的日誌檔案的路徑及檔名 --> <file>${logPath}/logback_error.log</file> <encoder> <pattern>${normalParttern}</pattern> <charset>UTF-8</charset> <!-- 設定字符集 --> </encoder> <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logPath}/logback-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxHistory>30</maxHistory> <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </TimeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 只打印錯誤日誌 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!--root其實也是一個特殊的logger,用來指定最基礎的日誌輸出級別,只有一個level屬性 不能設定為INHERITED或者同義詞NULL,預設是DEBUG 可以包含零個或多個元素,標識這個appender將會新增到這個logger--> <root level="INFO"> <appender-ref ref="console" /> <appender-ref ref="info_file" /> <appender-ref ref="warn_file" /> <appender-ref ref="error_file" /> </root> <!-- <logger>用來設定某一個包或者具體的某一個類的日誌列印級別、以及指定<appender> --> <!-- name:用來指定受此logger約束的某一個包或者具體的某一個類 --> <!-- addtivity:是否向上級logger傳遞列印資訊。預設是true --> <!--level:用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF 還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別 如果未設定此屬性,那麼當前logger將會繼承上級的級別 --> <logger name="com.example.demo.mapper" level="DEBUG" additivity="false"> <appender-ref ref="console"/> </logger> </configuration>
彩色日誌輸出格式如果應用到檔案輸出中會造成亂碼,所以在列印臺中使用即可
關於配置的詳解請參閱http://aub.iteye.com/blog/1101222
- 日誌使用理解
如果你有認真閱讀理解關於logback配置的詳解的話,就應該理解到:
1、appender 是一個列印工具,有具體的列印策略,需要接收日誌的輸入才能執行
2、logger 可以理解為一個日誌篩選器,會從指定目錄篩選符合自己設定級別的日誌
3、root 是一個特殊的logger,與logger的區別在於它篩選的是全域性而不是指定目錄
以上三個都具有自己的級別設定,這個設定可以理解為過濾鏈,最終能通過的肯定負責最底層的篩選,即appender的級別設定,鑑於日誌的靈活配置,建議使用方式為:
1、控制列印臺的appender不進行級別設定
2、root預設info即可,如果為debug級別則會列印太多框架執行資訊
3、由logger設定特殊的級別篩選進行自定義列印臺輸出
4、正式環境如不需要列印臺資訊,需要通過本系列的 多環境配置 將列印臺相關logger與appender-ref註釋掉