日志系列2——logback配置文件詳解


1.logback 配置文件的組成

1.1root節點

root 節點是必選節點,用來指定最基礎的日志輸出級別,只有一個 level 屬性,用於設置打印級別,可選如下:TRACE,DEBUG,INFO,WARN,ERROR,ALL,OFF

root 節點可以包含 0 個或多個元素,將appender添加進來。如下:

<root level="debug">
 <appender-ref ref="console" />
 <appender-ref ref="file" />
</root>

appender 也是子節點之一,將會在后面說明。

1.2.property節點

用於定義變量,方便使用。有兩個屬性:name,value。定義變量后,可以使用${}來使用變量。如下:

<property name="path" value="./log"/>
<property name="appname" value="app"/>

1.3.appender節點

​ appender中有2個必填屬性--name和class。name為節點的名稱,class為的全限定類名,也就是日志輸出目的地的處理類。其中,encoder子節點用來控制日志的輸出格式

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">  
    <encoder>  
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>  
    </encoder>  
</appender>  

appender 用來格式化日志輸出的節點,這個最重要。有兩個屬性:

  • name:該本 appender 命名
  • class:指定輸出策略,通常有兩種:控制台輸出,文件輸出

下面通過例子來說明這個怎么用:

在logback中,主要有以下三種日志目的地處理類:

1.3.1 ch.qos.logback.core.ConsoleAppender

​ 將日志輸出到控制台

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">  
    <encoder>  
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>  
    </encoder>  
</appender>  
1.3.2 ch.qos.logback.core.FileAppender

​ 將日志輸出到具體的磁盤文件中,可以單獨指定具體的位置,也可以設置日志的輸出格式;

<appender name="FILE" class="ch.qos.logback.core.FileAppender">  
    <file>e:/log.out</file>  
    <append>true</append>  
    <prudent>false</prudent>
    <encoder>  
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>  
    </encoder>  
</appender> 

子節點append:新增的日志是否以追加到文件結尾的方式寫入到log.out文件中,true為追加,fasle為清空現存文件寫入;
子節點prudent:日志是否被安全的寫入磁盤文件,默認為false。如果為true,則效率低下;

1.3.3 ch.qos.logback.core.rolling.RollingFileAppender

​ 滾動記錄日志,當符合rollingPolicy節點中設置的條件時,會將現有日志移到新的文件中去。rollingPolicy節點中可設置的條件為:文件的大小、時間等;

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>e:/log.out</file>
    <append>true</append>  
    <prudent>false</prudent>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>testLog-%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
</appender>
1.3.4 ch.qos.logback.classic.AsyncAppender

​ 異步記錄日志,內部通過使用緩存的方式來實現異步打印,將日志打印事件event放入緩存中。具體數據結構為BlockingQueue;

<appender name="FILE" class="ch.qos.logback.core.FileAppender">  
    <file>e:/log.out</file>  
    <append>true</append>  
    <prudent>false</prudent>
    <encoder>  
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>  
    </encoder>  
</appender> 
<appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">  
    <discardingThreshold>0</discardingThreshold>  
    <queueSize>512</queueSize>  
    <appender-ref ref ="FILE"/>  
</appender>  

​ 子節點queueSize:指的是BlockingQueue的隊列容量大小,默認為256個;
​ 子節點discardingThreshold:如果BlockingQueue中還剩余20%的容量,那么程序會丟棄TRACE、DEBUG和INFO級別的日志打印事件event,只保留WARN和ERROR級別的。為了保留所有的日志打印事件,可以將該值設置為0。

1.3.5 rollingPolicy

​ 日志文件的滾動策略,與RollingFileAppender搭配使用,當日志文件發生變動時決定RollingFileAppender的行為。在rollingPolicy節點中有一個class屬性,可選的值為TimeBasedRollingPolicy、FixedWindowRollingPolicy、TriggeringPolicy。其中ch.qos.logback.core.rolling.TimeBasedRollingPolicy表示根據時間制定日志文件的滾動策略;

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <fileNamePattern>testLog-%d{yyyy-MM-dd}.log</fileNamePattern>
    <maxHistory>30</maxHistory>
</rollingPolicy>

​ ch.qos.logback.core.rolling.FixedWindowRollingPolicy表示如果日志文件大小超過指定范圍時,會根據文件名拆分成多個文件;

<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">   
   <fileNamePattern>tests.%i.log.zip</fileNamePattern>   
   <minIndex>1</minIndex>   
   <maxIndex>4</maxIndex>   
 </rollingPolicy>  

2.配置文件例子

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--設置存儲路徑變量-->
    <property name="LOG_HOME" value="./log"/>

    <!--控制台輸出appender-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--設置輸出格式-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <!--設置編碼-->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--文件輸出,時間窗口滾動-->
    <appender name="timeFileOutput" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志名,指定最新的文件名,其他文件名使用FileNamePattern -->
        <File>${LOG_HOME}/timeFile/out.log</File>
        <!--文件滾動模式-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件輸出的文件名,可設置文件類型為gz,開啟文件壓縮-->
            <FileNamePattern>${LOG_HOME}/timeFile/info.%d{yyyy-MM-dd}.%i.log.gz</FileNamePattern>
            <!--日志文件保留天數-->
            <MaxHistory>30</MaxHistory>
            <!--按大小分割同一天的-->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <!--輸出格式-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <!--設置編碼-->
            <charset>UTF-8</charset>
        </encoder>

    </appender>
 <!-- 異步輸出 -->
    <appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丟失日志.默認的,如果隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 -->
        <queueSize>256</queueSize>
        <!-- 添加附加的appender,最多只能添加一個 -->
        <appender-ref ref="timeFileOutput"/>
    </appender>
    <!--指定基礎的日志輸出級別-->
    <root level="INFO">
        <!--appender將會添加到這個loger-->
        <appender-ref ref="console"/>
        <appender-ref ref="timeFileOutput"/>
    </root>
</configuration>

3 spring boot 使用logback日志

​ SpringBoot工程自帶logback和slf4j的依賴,所以只要在maven依賴中添加了spring-boot-starter-logging即可。logback框架會默認加載classpath下命名為logback-spring或logback的配置文件。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

3.1 簡單使用

​ 如果無需復雜的日志配置,執行簡單設置日志打印級別,打印方式可直接在 application.yml 中配置。

logging:
  # 配置日志存放路徑,日志文件名為:spring.log
  path: e:/log
  file:
    # 設置日志文件大小
    max-size: 20MB
  level:
    # root日志以info級別輸出
    root: info
    # 此包下所有class以DEBUG級別輸出
    com.demo.test: debug

3.2 多環境日志輸出

​ Spring Boot 官方推薦優先使用帶有 -spring 的文件名作為你的日志配置(如使用 logback-spring.xml ,而不是 logback.xml ),命名為 logback-spring.xml 的日志配置文件, spring boot 可以為它添加一些 spring boot 特有的配置項示例如下:

<configuration>
    <!-- 測試環境+開發環境. 多個使用逗號隔開. -->
    <springProfile name="test,dev">
        <logger name="com.test.demo" level="DEBUG" additivity="false">
            <appender-ref ref="console"/>
        </logger>
    </springProfile>
    <!-- 生產環境. -->
    <springProfile name="prod">
        <logger name="com.test.demo" level="INFO" additivity="false">
            <appender-ref ref="timeFileOutput"/>
        </logger>
    </springProfile>
</configuration>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM