Logback是log4j框架的作者開發的新一代日誌框架,它效率更高、能夠適應諸多的運行環境,同時天然支持SLF4J。默認情況下,Spring Boot會用Logback來記錄日誌,並用INFO級別輸出到控制檯。
1.添加日誌依賴
加入maven依賴中添加了spring-boot-starter-logging:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
2.自定義日誌配置
由於日誌服務一般都在ApplicationContext創建前就初始化了,它並不是必須通過Spring的配置文件控制。因此通過系統屬性和傳統的Spring Boot外部配置文件依然可以很好的支持日誌控制和管理。
根據不同的日誌系統,你可以按如下規則組織配置文件名,就能被正確加載:
- Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
- Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
- Log4j2:log4j2-spring.xml, log4j2.xml
上面是默認的命名規則,並且放在src/main/resources下面即可。
logback.xml的相關配置:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 second" debug="false">
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<logger name="org.springframework.web" level="DEBUG"/>
<property name="LOG_ROOT" value="/ms-logs"/>
<property name="LOG_PATH" value="ms-dataDictionary"/>
<property name="LOG_HOME" value="${LOG_ROOT}/${LOG_PATH}"/>
<appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>
[ %d{yyyy-MM-dd HH:mm:ss.SSS} ] [ %-5level] [ %-4line] --- [ %21thread ] %logger{96}: %msg%n
</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/INFO.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>64 MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<prudent>true</prudent>
</appender>
<appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>
[ %d{yyyy-MM-dd HH:mm:ss.SSS} ] [ %-5level] [ %-4line] --- [ %21thread ] %logger{96}: %msg%n
</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/ERROR.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>64 MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<prudent>true</prudent>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
[%d{yyyy-MM-dd HH:mm:ss.SSS}] [ %-5level] [ %-4line] --- [ %21thread ] %logger{32}: %msg%n
</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE-INFO"/>
<appender-ref ref="FILE-ERROR"/>
</root>
<!-- 開發、測試環境 -->
<springProfile name="dev,test">
<logger name="com.yss.ms" level="TRACE"/>
<logger name="com.mysql" level="WARN"/>
<logger name="com.alibaba" level="DEBUG"/>
<logger name="tk.mybatis" level="WARN"/>
<logger name="org.apache.commons" level="WARN"/>
<logger name="org.apache.xmlbeans" level="WARN"/>
<logger name="org.springframework.web" level="DEBUG"/>
</springProfile>
<!-- 生產環境 -->
<springProfile name="prod">
<logger name="com.yss.ms" level="INFO"/>
<logger name="com.mysql" level="INFO"/>
<logger name="com.alibaba" level="INFO"/>
<logger name="tk.mybatis" level="WARN"/>
<logger name="org.apache.commons" level="INFO"/>
<logger name="org.apache.xmlbeans" level="INFO"/>
<logger name="org.springframework" level="INFO"/>
</springProfile>
</configuration>
根節點<configuration>
包含的屬性:
- scan:當此屬性設置爲true時,配置文件如果發生改變,將會被重新加載,默認值爲true。
- scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan爲true時,此屬性生效。默認的時間間隔爲十秒。
- debug:當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。
根節點<configuration>
的子節點:
下面一共有2個屬性,3個子節點,分別是:
屬性一:設置上下文名稱<contextName>
每個logger都關聯到logger上下文,默認上下文名稱爲“default”。但可以使用<contextName>
設置成其他名字,用於區分不同應用程序的記錄。一旦設置,不能修改,可以通過%contextName來打印日誌上下文名稱。
<contextName>logback</contextName>
屬性二:設置變量<property>
用來定義變量值的標籤,<property>
有兩個屬性,name和value;其中name的值是變量的名稱,value的值時變量定義的值。通過<property>
定義的值會被插入到logger上下文中。定義變量後,可以使“${}”來使用變量。
<property name="LOG_ROOT" value="/ms-logs"/>
<property name="LOG_PATH" value="ms-dataDictionary"/>
<property name="LOG_HOME" value="${LOG_ROOT}/${LOG_PATH}"/>
子節點一<appender>
appender用來格式化日誌輸出節點,有倆個屬性name和class,class用來指定哪種輸出策略,常用就是控制檯輸出策略和文件輸出策略。
控制檯輸出ConsoleAppender:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
[%d{yyyy-MM-dd HH:mm:ss.SSS}] [ %-5level] --- [ %21thread ] %logger{32}: %msg%n
</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
encoder表示對日誌進行編碼:
* %d{yyyy-MM-dd HH:mm:ss.SSS}——日誌輸出時間
* %thread——輸出日誌的進程名字,這在Web應用以及異步任務處理中很有用
* %-5level——日誌級別,並且使用5個字符靠左對齊
* %logger{32}——日誌輸出者的名字
* %msg——日誌消息
* %n——平臺的換行符
輸出到文件RollingFileAppender:
<appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>
[ %d{yyyy-MM-dd HH:mm:ss.SSS} ] [ %-5level] [ %-4line] --- [ %21thread ] %logger{96}: %msg%n
</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/ERROR.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>64 MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<prudent>true</prudent>
</appender>
rollingPolicy:
上例中<fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/ERROR.%i.log</fileNamePattern>
定義了日誌的切分方式——把每一天的日誌歸檔到一個文件中,<maxHistory>30</maxHistory>
表示只保留最近30天的日誌,以防止日誌填滿整個磁盤空間。同理,可以使用%d{yyyy-MM-dd}來定義精確的日誌切分方式。<maxFileSize>64 MB</maxFileSize>
用來指定日誌文件的上限大小,例如設置爲64MB的話,那麼到了這個值,就會刪除舊的日誌。
ThresholdFilter:
系統定義的攔截器,例如我們用ThresholdFilter來過濾掉ERROR級別以下的日誌不輸出到文件中。如果不用記得註釋掉,不然你控制檯會發現沒日誌~
子節點二<root>
:
root節點是必選節點,用來指定最基礎的日誌輸出級別,只有一個level屬性。
* level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默認是DEBUG。
可以包含零個或多個<appender-ref>
元素,標識這個appender將會添加到這個loger:
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE-INFO"/>
<appender-ref ref="FILE-ERROR"/>
</root>
多環境日誌輸出
據不同環境(prod:生產環境,test:測試環境,dev:開發環境)來定義不同的日誌輸出
<!-- 開發、測試環境 -->
<springProfile name="dev,test">
<logger name="com.yss.ms" level="TRACE"/>
<logger name="com.mysql" level="WARN"/>
<logger name="com.alibaba" level="DEBUG"/>
<logger name="tk.mybatis" level="WARN"/>
<logger name="org.apache.commons" level="WARN"/>
<logger name="org.apache.xmlbeans" level="WARN"/>
<logger name="org.springframework.web" level="DEBUG"/>
</springProfile>
可以啓動服務的時候指定 profile (如不指定使用默認),如指定dev的方式爲:
java -jar xxx.jar –spring.profiles.active=dev