logback使用說明

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章