logback 配置文件編寫

Logback 配置

本文講logback的xml文件的配置,其中主要是在介紹各類appender。

logback 的簡單例子

xml文件大概結構 導圖鏈接
不同的appender下還有不同的元素,這裏沒有一一列出

xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <contextName>拽拽壞人幫</contextName>

    <!--輸出到控制檯 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%cn %d{hh:MM:ss} [%20logger{0}] - %message%n</pattern>
        </encoder>
    </appender>

    <logger name = "com.cck.MyLogback">
        <appender-ref ref = "STDOUT"/>
    </logger>

    <root level="debug"></root>

</configuration>

代碼使用

public class MyLogback {

    private final static Logger logger 
        = LoggerFactory.getLogger("com.cck.MyLogback");

    public static void main(String[] args) {

        logger.info("hello world");
    }
}

xml配置中的appender

appender 節點是配置日誌的目的地,該節點必須指定name和class屬性,不同的class會有不同的子節點。

分別有以下幾種類型的appender

  • ConsoleAppender   控制檯
  • FileAppender     文件
  • RollingFileAppender  滾動記錄文件
  • SiftingAppender      自定義篩選文件

1. ConsoleAppender 控制檯

xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <contextName>拽拽壞人幫</contextName>
    
    <!--輸出到控制檯 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%cn -%.-1p %d{hh:MM:ss} [%8logger{26}] - %message%n</pattern>
        </encoder>
        <targer>
            System.err
        </target>
    </appender>

    <logger name="com.cck.MyLogback">
        <appender-ref ref="STDOUT" />
    </logger>

    <root level="debug"></root>
</configuration>
<target>String</target> 用於指定字符串在控制檯的打印方式
默認是 System.out, 也可以是System.err

2. FileAppender 文件

xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">

    <contextName>拽拽壞人幫</contextName>

    <!--輸出到文件 -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logback.log</file>
        <encoder>
            <pattern>%cn -%.-1p %d{hh:MM:ss} [%8logger{26}] - %message%n</pattern>
        </encoder>
        <append>true</append>
        <prudent>true</prudent>
    </appender>

    <logger name="com.cck.MyLogback" level="debug">
        <appender-ref ref="FILE" />
    </logger>

    <root level="info"></root>
</configuration>
<file>logback.log</file> 指定日誌文件名

<append>true</append> 日誌是否追加到文件結尾,默認是true

<prudent>true</prudent> true的情況下,日誌會被安全地寫入到文件 (加了鎖,因爲存在多個FileAppender同時向日志文件寫入的情況),默認是false

3. RollingFileAppender 滾動記錄文件

3.1 滾動記錄文件 -- 根據時間 TimeBasedRollingPolicy

xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">

    <contextName>拽拽壞人幫</contextName>

    <!--滾動記錄文件 根據時間 -->
    <appender name="timeRollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>%cn -%.-1p %d{hh:MM:ss} [%8logger{26}] - %message%n</pattern>
        </encoder>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logFile/%d{yyyy/MM/dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <logger name="com.cck.MyLogback" level="debug">
        <appender-ref ref="timeRollFile" />
    </logger>

    <root level="info"></root>
</configuration>
<rollingPolicy></rollingPolicy> 指定滾動行爲

rollingPolicy 子節點 <fileNamePattern></fileNamePattern> 指定文件名模式, yyyy/mm/dd 表示按天滾動 模式例子

<maxHistory>30</maxHistory> 控制保存的最大文件數量
如果是每天滾動<maxHistory>30</maxHistory>表示保存最近30天的日誌文件

3.2 滾動記錄文件 -- 根據長度 FixedWindowRollingPolicy

xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">

    <contextName>拽拽壞人幫</contextName>

    <!--滾動記錄文件 根據固定長度 -->
     <appender name="fixedRollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>testFixedRollFile.log</file>
        
        <encoder>
            <pattern>%d{hh:MM:ss} [%20logger{0}] - %message%n</pattern>
        </encoder>

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

        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>1KB</maxFileSize>
        </triggeringPolicy>
    </appender>

    <logger name="com.cck.MyLogback" level="debug">
        <appender-ref ref="fixedRollFile" />
    </logger>

    <root level="info"></root>
</configuration>
<rollingPolicy></rollingPolicy> 指定根據窗口長度進滾動。
注意,使用 FixedWindowRollingPolicy 必須聲明<file></file>節點

rollingPolicy 子節點 <fileNamePattern></fileNamePattern> 指定命名模式
注意,必須包含%i,i 爲窗口索引。
滾動時,日誌文件名爲logFile/logFile'i'.log
eg .logFile/logFile1.log logFile/logFile2.log

rollingPolicy 子節點 <minIndex>1</minIndex> 指定 i 的最小值

rollingPolicy 子節點 <maxIndex>5</maxIndex> 指定 i 的最大值

<triggeringPolicy></triggeringPolicy > 指定何時滾動

triggeringPolicy 子節點 <maxFileSize>1KB</maxFileSize> 指定文件大小爲 1KB 時進行滾動

4. SiftingAppender 自定義篩選文件

假設有以下需求

userId 是6位的,現在想讓前4位id相同的用戶的日誌放在一個文件夾中。並且id爲 000000 單獨拿出來。
也就是以下的效果:

           /000000.log
           /0001
              /01.log
              /23.log
           /0002
              /12.log
              /00.log

第一步,按照業務需求編寫Java類

package com.cck;                                                                                                                                                                                                                                                                                               
import java.util.Map;                                                                                                                                                                                                                                                                                     
import ch.qos.logback.classic.spi.ILoggingEvent;                                                                                                        
import ch.qos.logback.core.sift.AbstractDiscriminator;                                                                                                  
                                                                                                                                                        
public class MyLoggerDiscriminator extends AbstractDiscriminator<ILoggingEvent> {                                                                       
                                                                                                                                                        
    public final static String KEY = "user";                                                                                                            
                                                                                                                                                        
    private String filePath;                                                                                                                            
    private String fileName;                                                                                                                            
                                                                                                                                                        
    private String defaultValue = "000000";                                                                                                             
                                                                                                                                                        
    public String getDefaultValue() {                                                                                                                   
        return defaultValue;                                                                                                                            
    }                                                                                                                                                   
                                                                                                                                                        
    public void setDefaultValue(String defaultValue) {                                                                                                  
        this.defaultValue = defaultValue;                                                                                                               
    }                                                                                                                                                   
                                                                                                                                                        
    @Override                                                                                                                                           
    public String getDiscriminatingValue(ILoggingEvent e) {                                                                                             
        // 拿到mdc                                                                                                                                        
        Map<String, String> mdc = e.getMDCPropertyMap();                                                                                                
                                                                                                                                                        
        String user = mdc.get(KEY);                                                                                                                     
                                                                                                                                                        
        if(user == null || user == "000000") {                                                                                                          
            return defaultValue;                                                                                                                        
        }                                                                                                                                               
        // 返回一個路徑                                                                                                                                       
        filePath = user.substring(0, 4) + "/";                                                                                                          
        fileName = user.substring(4, 6);                                                                                                                
        return filePath + fileName;                                                                                                                     
    }                                                                                                                                                   
                                                                                                                                                        
    @Override                                                                                                                                           
    public String getKey() {                                                                                                                            
        return KEY;                                                                                                                                     
    }                                                                                                                                                   
                                                                                                                                                        
}   

第二步,在xml使用

<?xml version="1.0" encoding="UTF-8"?>                                                                                                                  
<configuration debug="false">                                                                                                                           
                                                                                                                                                        
    <contextName>拽拽壞人幫</contextName>                                                                                                                    
                                                                                                                                                        
    <!-- 自定義 -->                                                                                                                                        
    <appender name="siftingLog" class="ch.qos.logback.classic.sift.SiftingAppender">                                                                                                                                                                                                                  
        <discriminator class="com.cck.MyLoggerDiscriminator" />                                                                                         
                                                                                                                                                        
        <sift>                                                                                                                                          
            <appender name="user-${user}" class="ch.qos.logback.core.rolling.RollingFileAppender">                                                      
                <file>siftingLog/${user}.log</file>                                                                                                     
                <encoder>                                                                                                                               
                    <pattern>%date{HH:mm:ss} %.-1level[%25logger{0}] - &lt;%message&gt;%n</pattern>                                                     
                </encoder>                                                                                                                              
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">                                                              
                    <fileNamePattern>siftingLog/${user}.%d{yyyy-MM-dd}.log.gz</fileNamePattern>                                                         
                </rollingPolicy>                                                                                                                        
            </appender>                                                                                                                                 
        </sift>                                                                                                                                         
    </appender>                                                                                                                                         
                                                                                                                                                        
    <logger name="com.cck.MyLogback" level="debug">                                                                                                     
        <appender-ref ref="siftingLog" />                                                                                                               
    </logger>                                                                                                                                           
                                                                                                                                                        
    <root level="info"></root>                                                                                                                          
</configuration>                                                                                                                                        
<discriminator class="com.cck.MyLoggerDiscriminator" /> 指定自定自定義的鑑別類

第三步,使用

package com.cck;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

public class MyLogback {

    private final static Logger logger = LoggerFactory.getLogger("com.cck.MyLogback");

    public static void main(String[] args) {
        
        MDC.put(MyLoggerDiscriminator.KEY, "156651");
        logger.debug("hello world");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章