日誌框架一logback配置和使用

把logback或者log4j放在src/main/resources下,Spring容器就能夠自動加載日誌文件。java

前言

Logback是由log4j創始人設計的又一個開源日誌組件, 比log4j的性能好.api

1.導入依賴

<!--這個依賴直接包含了 logback-core 以及 slf4j-api的依賴-->
<dependency>
     <groupId>ch.qos.logback</groupId>
     <artifactId>logback-classic</artifactId>
     <version>1.2.3</version>
</dependency>

2.Logback的主要模塊

  • logback-core: 核心代碼模塊
  • logback-classic: log4j的一個改良版本,同時實現了slf4j的接口,這樣你若是以後要切換其餘日誌組件也是一件很容易的事
  • logback-access: 訪問模塊與Servlet容器集成提供經過Http來訪問日誌的功能

3.配置獲取順序

logback在啓動的時候,會按照下面的順序加載配置文件:app

  1. 若是java程序啓動時指定了logback.configurationFile屬性,就用該屬性指定的配置文件。
    java -Dlogback.configurationFile=/path/to/mylogback.xml Test,這樣執行Test類的時候就會加載/path/to/mylogback.xml配置.
  2. 在classpath中查找 logback.groovy 文件
  3. 在classpath中查找 logback-test.xml 文件
  4. 在classpath中查找 logback.xml 文件
  5. 若是是 jdk6+,那麼會調用ServiceLoader 查找 com.qos.logback.classic.spi.Configurator接口的第一個實現類,
    自動使用ch.qos.logback.classic.BasicConfigurator,在控制檯輸出日誌.

4.配置文件的節點的結構

contextName節點

設置日誌上下文名稱,後面輸出格式中能夠經過定義%contextName來打印日誌上下文名稱性能

property節點

用來設置相關變量,經過key-value的方式配置,而後在後面的配置文件中經過${key}來訪問this

appender:負責寫日誌的組件, 主要用來設置日誌的輸出位置, 日誌文件的生成策略等
  • appender
    1. ConsoleAppender:向控制檯輸出日誌內容的組件,只要定義好encoder節點就可使用。
      • <encoder>:對記錄事件進行格式化。
      • filter:定義了一個過濾器,在LEVEL之下的日誌輸出不會被打印出來
    2. FileAppender:向文件輸出日誌內容的組件,用法也很簡單,不過因爲沒有日誌滾動策略,通常不多使用
    3. RollingFileAppender:向文件輸出日誌內容的組件,同時能夠配置日誌文件滾動策略,在日誌達到必定條件後生成一個新的日誌文件. 它有下面幾個子節點:
      • <file>:被寫入的文件名,能夠是相對目錄,也能夠是絕對目錄,若是上級目錄不存在會自動建立,沒有默認值。
      • <append>:若是是 true,日誌被追加到文件結尾,若是是 false,清空現存文件,默認是true。
      • <encoder>:對記錄事件進行格式化。
      • Policy:兩個經常使用熱門的策略,TimeBaseRollingPolicy, SizeBasedTriggeringPolicy
        - TimeBaseRollingPolicy:根據fileNamePattern標籤來表示什麼週期觸發一次,生成新的日誌文件
        - SizeBasedTriggeringPolicy:表示基於文件大小進行滾動
      • <rollingPolicy>:當發生滾動時,決定RollingFileAppender的行爲,涉及文件移動和重命名。
      • <triggeringPolicy>: 告知RollingFileAppender什麼時候激活滾動。
      • <prudent>:當爲true時,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,可是有兩個限制,1不支持也不容許文件壓縮,2不能設置file屬性,必須留空。
      • filter:定義了一個過濾器,在LEVEL之下的日誌輸出不會被打印出來
logger:爲不一樣的包使用不一樣的log配置,用來設置某一個包或者具體的某一個類的日誌打印級別
  • name:用來指定受此loger約束的某一個包或者具體的某一個類。
  • level:用來設置打印級別(日誌級別),大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,表明強制執行上級的級別。若是上面的logger沒有設置level屬性, 會繼承root的屬性
  • addtivity:是否向上級loger傳遞打印信息。默認是true。咱們可使用logger節點的additivity="false"屬性來屏蔽rootLogger的appender。這樣就能夠不使用rootLogger的appender輸出日誌了。

<logger>能夠包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個loger。spa

root:也是 元素,可是它是根logger,只有一個level屬性
  1. level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設置爲INHERITED或者同義詞NULL。默認是DEBUG。
  2. 若是上面的logger沒有設置level屬性, 會繼承root的屬性。
  3. 能夠包含零個或多個 元素。

注:
  1. rootlogger同時引入同一個appender,而且additivity="true",則這個appender會輸出多份
  2. level默認是以覆蓋的方式繼承的,若是父親的級別是DEBUG,若是在這個logger中設置了INFO,最終這個logger的級別就是INFO
  3. 若是一個指定的logger標籤沒有指定level的話,就會繼承離他最近的祖先的級別
  4. 若是appender指定了filterlogger不用寫level屬性。
<?xml version="1.0" encoding="utf-8"?>

<!--scan:當此屬性設置爲true時,配置文件若是發生改變,將會被從新加載,默認值爲true。-->
<!--scanPeriod:設置監測配置文件是否有修改的時間間隔,若是沒有給出時間單位,默認單位是毫秒。當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。-->
<!--debug:當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <!--日誌上下文名稱-->
    <contextName>logback</contextName>

    <!--定義參數常量-->
    <property name="log.level" value="debug"></property>
    <property name="log.maxHistory" value="30"></property>
    <property name="log.filePath" value="/"></property>
    <property name="log.pattern"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n">
    </property>


    <!--級別從高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL-->
    <!--日誌輸出規則:根據當前ROOT級別,日誌輸出時,級別高於root默認的級別時會輸出-->


    <!--控制檯設置-->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">

        <!--記錄事件進行格式化-->
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>

    </appender>


    <!--日誌文件-->
    <!--滾動記錄文件,先將日誌記錄到指定文件,當符合某個條件時,將日誌記錄到其餘文件RollingFileAppender-->
    <!--debug-->
    <appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <!--文件路徑-->
        <file>${log.filePath}/debug.log</file>

        <!--當發生滾動時,決定RollingFileAppender的行爲,涉及文件移動和重命名。-->
        <!--最經常使用的滾動策略,它根據時間來制定滾動策略.既負責滾動也負責觸發滾動。根據<fileNamePattern>肯定滾動時間-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件名稱-->
            <fileNamePattern>${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
            <!--文件最大保存歷史 30天-->
            <maxHistory>${log.maxHistory}</maxHistory>
            <!--日誌文件最大的大小-->
            <MaxFileSize>5M</MaxFileSize>
        </rollingPolicy>

        <!--記錄事件進行格式化-->
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>

        <!--定義了一個過濾器,在level之下的日誌輸出不會被打印出來-->
        <!--這裏定義了DEBUG,也就是控制檯不會輸出比DEBUG級別小的日誌-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 設置過濾級別 -->
            <level>DEBUG</level>
            <!--ACCEPT–打印
                DENY– 不打印
                NEUTRAL–中立-->
            <!-- 用於配置符合過濾條件的操做 -->
            <onMatch>ACCEPT</onMatch>
            <!-- 用於配置不符合過濾條件的操做 -->
            <onMismatch>DENY</onMismatch>
        </filter>

    </appender>


    <!--info-->
    <appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <!--文件名稱-->
        <file>${log.filePath}/info.log</file>

        <!--按照固定窗口模式生成日誌文件,當文件大於5MB時,生成新的日誌文件。窗口大小是1到3,當保存了3個歸檔文件後,將覆蓋最先的日誌。-->
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>${log.filePath}/info/info.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
                <minIndex>1</minIndex>
                <maxIndex>3</maxIndex>
        </rollingPolicy>

        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>5MB</maxFileSize>
        </triggeringPolicy>

        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

    </appender>


    <!--設置一個向上傳遞的appender,全部級別的日誌都會輸出-->
    <appender name="appender" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${log.filePath}/all.log</file>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.filePath}/all/all.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
            <maxHistory>${log.maxHistory}</maxHistory>
            <MaxFileSize>5M</MaxFileSize>
        </rollingPolicy>

        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>

    </appender>


    <!--設置某一個包或者具體的某一個類的打印級別,name表明包名。會屏蔽rootLogger的appender-->
    <logger name="com.Logger" additivity="false">

        <appender-ref ref="consoleAppender"/>

        <!--分級別分別輸出(debugAppender和infoAppender),屏蔽root的appender-->
        <appender-ref ref="debugAppender"/>
        <appender-ref ref="infoAppender"/>
    </logger>


    <!-- 打印debug級別日誌及以上級別日誌 -->
    <root level="DEBUG">
        <!-- 控制檯輸出 -->
        <appender-ref ref="consoleAppender"/>

        <!-- 無論什麼包下的日誌都輸出到文件,全部級別的日誌分級別輸出-->
        <!--<appender-ref ref="ERROR"/>-->
        <!--<appender-ref ref="INFO"/>-->
        <!--<appender-ref ref="WARN"/>-->
        <!--<appender-ref ref="DEBUG"/>-->
        <!--<appender-ref ref="TRACE"/>-->
    </root>

</configuration>

五.使用Log大體須要下面三個步驟:

  1. 配置logback運行參數,通常經過logback.xml配置便可
  2. 在每一個須要進行log的類中,建立一個Logger實例
    private static final Logger log= LoggerFactory.getLogger(this.class);
  3. 使用這個實例,調用debug(), info(), warn(), error(),trace()等方法向Appenders輸出不一樣級別的Log
    Appenders是輸出源,在LogBack中可使用控制檯、文件、系統log、TCP端口等等多種輸出源。
    log.info("I am fine.");
相關文章
相關標籤/搜索