SpringBoot拾級(jí)而上·日志配置

這里我們介紹官方推薦的 logback

一、配置日志文件

spring boot 默認(rèn)會(huì)加載 classpath:logback-spring.xml
如需要自定義文件名稱,在 application.properties 中配置 logging.config 選項(xiàng)即可。
在 src/main/resources 下創(chuàng)建 logback-spring.xml 文件,內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 文件輸出格式 -->
    <property name="PATTERN" value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) |-%-5level [%thread] %c [%L] -| %msg%n" />
    <!--定義日志文件的存儲(chǔ)地址 勿在 LogBack 的配置中使用相對路徑-->
    <property name="LOG_PATH" value="/Users/feiyong/code/spring_boot/springboot_web/log" />
    <!-- dev -->
    <property name="DEV_FILE_PATH" value="/Users/feiyong/code/spring_boot/springboot_web/log/dev" />
    <!-- test文件路徑 -->
    <property name="TEST_FILE" value="/Users/feiyong/code/spring_boot/springboot_web/log/test/test.log" />
    <property name="TEST_FILE_PATH" value="/Users/feiyong/code/spring_boot/springboot_web/log/test" />
    <!-- pro文件路徑 -->
    <property name="PRO_FILE_PATH" value="/Users/feiyong/code/spring_boot/springboot_web/log/pro" />

    <!-- 開發(fā)環(huán)境 -->
    <springProfile name="dev">
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>${PATTERN}</pattern>
            </encoder>
        </appender>
        <logger name="com.light.springboot" level="debug" />
        <root level="info">
            <appender-ref ref="CONSOLE" />
        </root>
    </springProfile>

    <!-- 測試環(huán)境 所有日志都只記錄在test.log中-->
    <springProfile name="test">
        <!-- 每天產(chǎn)生一個(gè)文件 -->
        <appender name="TEST-FILE" class="ch.qos.logback.core.FileAppender">
            <!-- 文件路徑 -->
            <file>${TEST_FILE}</file>
            <append>true</append>
            <encoder>
                <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
            </encoder>
        </appender>
        <root level="info">
            <appender-ref ref="TEST-FILE" />
        </root>
    </springProfile>

    <!-- 生產(chǎn)環(huán)境 按日期記錄日志-->
    <springProfile name="prod">
        <appender name="PROD_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--<fileNamePattern>${PRO_FILE_PATH}/warn.%d{yyyy-MM-dd HH:mm:ss.SSS}.log</fileNamePattern>-->
                <fileNamePattern>${PRO_FILE_PATH}/%d{yyyy-MM-dd}.log</fileNamePattern>
                <MaxHistory>100</MaxHistory>
            </rollingPolicy>
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>${PATTERN}</pattern>
            </layout>
        </appender>
        <root level="warn">
            <appender-ref ref="PROD_FILE" />
        </root>
    </springProfile>
</configuration>

其中,springProfile 標(biāo)簽的 name 屬性對應(yīng) application.properties 中的 spring.profiles.active 的配置。
即 spring.profiles.active 的值可以看作是日志配置文件中對應(yīng)的 springProfile 是否生效的開關(guān)。

另外,我們在src的同級(jí)目錄下,新建log目錄,在log目錄下新建dev,test,pro三個(gè)目錄,在test目錄下新建test.log文件。

下面我們來依次介紹,日志各種配置

二、logback的配置介紹

1、Logger、appender及l(fā)ayout
Logger作為日志的記錄器,把它關(guān)聯(lián)到應(yīng)用的對應(yīng)的context上后,主要用于存放日志對象,也可以定義日志類型、級(jí)別。
Appender主要用于指定日志輸出的目的地,目的地可以是控制臺(tái)、文件、遠(yuǎn)程套接字服務(wù)器、 MySQL、PostreSQL、 Oracle和其他數(shù)據(jù)庫、 JMS和遠(yuǎn)程UNIX Syslog守護(hù)進(jìn)程等。
Layout 負(fù)責(zé)把事件轉(zhuǎn)換成字符串,格式化的日志信息的輸出。
2、logger context
各個(gè)logger 都被關(guān)聯(lián)到一個(gè) LoggerContext,LoggerContext負(fù)責(zé)制造logger,也負(fù)責(zé)以樹結(jié)構(gòu)排列各logger。其他所有l(wèi)ogger也通過org.slf4j.LoggerFactory 類的靜態(tài)方法getLogger取得。 getLogger方法以 logger名稱為參數(shù)。用同一名字調(diào)用LoggerFactory.getLogger 方法所得到的永遠(yuǎn)都是同一個(gè)logger對象的引用。
3、有效級(jí)別及級(jí)別的繼承
Logger 可以被分配級(jí)別。級(jí)別包括:TRACE、DEBUG、INFO、WARN 和 ERROR,定義于ch.qos.logback.classic.Level類。如果 logger沒有被分配級(jí)別,那么它將從有被分配級(jí)別的最近的祖先那里繼承級(jí)別。root logger 默認(rèn)級(jí)別是 DEBUG。
4、打印方法與基本的選擇規(guī)則
打印方法決定記錄請求的級(jí)別。例如,如果 L 是一個(gè) logger 實(shí)例,那么,語句 L.info("..")是一條級(jí)別為 INFO的記錄語句。記錄請求的級(jí)別在高于或等于其 logger 的有效級(jí)別時(shí)被稱為被啟用,否則,稱為被禁用。記錄請求級(jí)別為 p,其 logger的有效級(jí)別為 q,只有則當(dāng) p>=q時(shí),該請求才會(huì)被執(zhí)行。
該規(guī)則是 logback 的核心。級(jí)別排序?yàn)椋?TRACE < DEBUG < INFO < WARN < ERROR
5、logback的默認(rèn)配置
如果配置文件 logback-test.xml 和 logback.xml 都不存在,那么 logback 默認(rèn)地會(huì)調(diào)用BasicConfigurator ,創(chuàng)建一個(gè)最小化配置。最小化配置由一個(gè)關(guān)聯(lián)到根 logger 的ConsoleAppender 組成。輸出用模式為%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的 PatternLayoutEncoder 進(jìn)行格式化。root logger 默認(rèn)級(jí)別是 DEBUG。

三、logback.xml常用配置詳解

A、appender

子節(jié)點(diǎn)<appender>:負(fù)責(zé)寫日志的組件,它有兩個(gè)必要屬性name和class。name指定appender名稱,class指定appender的全限定名

1、控制臺(tái)輸出

ch.qos.logback.core.ConsoleAppender 把日志輸出到控制臺(tái),有以下子節(jié)點(diǎn):
<encoder>:對日志進(jìn)行格式化。(具體參數(shù)稍后講解 )
<target>:字符串System.out(默認(rèn))或者System.err(區(qū)別不多說了)
在dev環(huán)境我們用來調(diào)試,日志信息只需要打印在CONSOLE控制臺(tái)就可以了,

<!-- 開發(fā)環(huán)境 -->
    <springProfile name="dev">
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>${PATTERN}</pattern>
            </encoder>
        </appender>
        <logger name="com.light.springboot" level="debug" />
        <root level="info">
            <appender-ref ref="CONSOLE" />
        </root>
    </springProfile>

<root level="info">配置表示把>=INFO級(jí)別的日志都輸出到控制臺(tái)

2、日志輸出在單個(gè)指定文件

ch.qos.logback.core.FileAppender:把日志添加到文件,有以下子節(jié)點(diǎn):
<file>:被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級(jí)目錄不存在會(huì)自動(dòng)創(chuàng)建,沒有默認(rèn)值。
<append>:如果是 true,日志被追加到文件結(jié)尾,如果是 false,清空現(xiàn)存文件,默認(rèn)是true。
<encoder>:對記錄事件進(jìn)行格式化。
<prudent>:如果是 true,日志會(huì)被安全的寫入文件,即使其他的FileAppender也在向此文件做寫入操作,效率低,默認(rèn)是 false。

當(dāng)切換到test,環(huán)境后,我們在file標(biāo)簽內(nèi)指定日志的輸出文件,
注:在LogBack 的配置中,定義日志文件的存儲(chǔ)地址不要使用相對路徑

    <!-- 測試環(huán)境 所有日志都只記錄在test.log中-->
    <springProfile name="test">
        <!-- 每天產(chǎn)生一個(gè)文件 -->
        <appender name="TEST-FILE" class="ch.qos.logback.core.FileAppender">
            <!-- 文件路徑 -->
            <file>${TEST_FILE}</file>
            <append>true</append>
            <encoder>
                <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
            </encoder>
        </appender>
        <root level="info">
            <appender-ref ref="TEST-FILE" />
        </root>
    </springProfile>

3、按日期切分日志文件

RollingFileAppender:滾動(dòng)記錄文件,先將日志記錄到指定文件,當(dāng)符合某個(gè)條件時(shí),將日志記錄到其他文件。有以下子節(jié)點(diǎn):
<file>:被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級(jí)目錄不存在會(huì)自動(dòng)創(chuàng)建,沒有默認(rèn)值。
<append>:如果是 true,日志被追加到文件結(jié)尾,如果是 false,清空現(xiàn)存文件,默認(rèn)是true。
<rollingPolicy>:當(dāng)發(fā)生滾動(dòng)時(shí),決定RollingFileAppender的行為,涉及文件移動(dòng)和重命名。屬性class定義具體的滾動(dòng)策略類
      class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy": 最常用的滾動(dòng)策略,它根據(jù)時(shí)間來制定滾動(dòng)策略,既負(fù)責(zé)滾動(dòng)也負(fù)責(zé)出發(fā)滾動(dòng)。有以下子節(jié)點(diǎn):
<fileNamePattern>:必要節(jié)點(diǎn),包含文件名及“%d”轉(zhuǎn)換符,“%d”可以包含一個(gè)java.text.SimpleDateFormat指定的時(shí)間格式,如:%d{yyyy-MM}。
如果直接使用 %d,默認(rèn)格式是 yyyy-MM-dd。RollingFileAppender的file字節(jié)點(diǎn)可有可無,通過設(shè)置file,可以為活動(dòng)文件和歸檔文件指定不同位置,當(dāng)前日志總是記錄到file指定的文件(活動(dòng)文件),活動(dòng)文件的名字不會(huì)改變;
如果沒設(shè)置file,活動(dòng)文件的名字會(huì)根據(jù)fileNamePattern 的值,每隔一段時(shí)間改變一次。“/”或者“\”會(huì)被當(dāng)做目錄分隔符。
<maxHistory>:
可選節(jié)點(diǎn),控制保留的歸檔文件的最大數(shù)量,超出數(shù)量就刪除舊文件。假設(shè)設(shè)置每個(gè)月滾動(dòng),且<maxHistory>是6,則只保存最近6個(gè)月的文件,刪除之前的舊文件。注意,刪除舊文件是,那些為了歸檔而創(chuàng)建的目錄也會(huì)被刪除。
      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy": 查看當(dāng)前活動(dòng)文件的大小,如果超過指定大小會(huì)告知RollingFileAppender 觸發(fā)當(dāng)前活動(dòng)文件滾動(dòng)。只有一個(gè)節(jié)點(diǎn):
<maxFileSize>:這是活動(dòng)文件的大小,默認(rèn)值是10MB。
<prudent>:當(dāng)為true時(shí),不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有兩個(gè)限制,1不支持也不允許文件壓縮,2不能設(shè)置file屬性,必須留空。
<triggeringPolicy >: 告知 RollingFileAppender 合適激活滾動(dòng)。
      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy" 根據(jù)固定窗口算法重命名文件的滾動(dòng)策略。有以下子節(jié)點(diǎn):
<minIndex>:窗口索引最小值
<maxIndex>:窗口索引最大值,當(dāng)用戶指定的窗口過大時(shí),會(huì)自動(dòng)將窗口設(shè)置為12。
<fileNamePattern>:必須包含“%i”例如,假設(shè)最小值和最大值分別為1和2,命名模式為 mylog%i.log,會(huì)產(chǎn)生歸檔文件mylog1.log和mylog2.log。還可以指定文件壓縮選項(xiàng),例如,mylog%i.log.gz 或者 沒有l(wèi)og%i.log.zip

在prod環(huán)境,我們在fileNamePattern標(biāo)簽下指定日志的輸入文件,

    <!-- 生產(chǎn)環(huán)境 按日期記錄日志-->
    <springProfile name="prod">
        <appender name="PROD_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--<file>${PRO_FILE_PATH}</file>-->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${PRO_FILE_PATH}/warn.%d{yyyy-MM-dd}.log</fileNamePattern>
                <MaxHistory>100</MaxHistory>
            </rollingPolicy>
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>${PATTERN}</pattern>
            </layout>
        </appender>
        <root level="warn">
            <appender-ref ref="PROD_FILE" />
        </root>
    </springProfile>

4、構(gòu)造測試方法

這里我們改寫第一個(gè)demo

package com.springboot.springboot_web.control;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.*;

//@RestController注解能夠使項(xiàng)目支持Rest
@RestController
@SpringBootApplication
//表示該controller類下所有的方法都公用的一級(jí)上下文根
@RequestMapping(value = "/springboot")
public class HttpDemoControl {

    private final static Logger logger = LoggerFactory.getLogger(HttpDemoControl.class);

    //http://127.0.0.1:8080/springboot/getUserByGet?userName=fei
    //這里使用@RequestMapping注解表示該方法對應(yīng)的二級(jí)上下文路徑
    @RequestMapping(value = "/getUserByGet", method = RequestMethod.GET)
    String getUserByGet(@RequestParam(value = "userName") String userName){
        logger.debug("logback debug");
        logger.info("logback info");
        logger.warn("logback warn");
        logger.error("logback error");
        return "Hello " + userName;
    }
}

當(dāng)我們切換到test時(shí),可以看到test.log文件記錄了日志,
當(dāng)我們切換到prod時(shí),可以看到新生成的warn.2018-07-22.log文件,里面僅僅記錄了兩條日志,

2018-07-22 17:10:32.315 |-WARN  [http-nio-8085-exec-1] com.springboot.springboot_web.control.HttpDemoControl [23] -| logback warn
2018-07-22 17:10:32.316 |-ERROR [http-nio-8085-exec-1] com.springboot.springboot_web.control.HttpDemoControl [24] -| logback error

感謝:
https://www.cnblogs.com/warking/p/5710303.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容