logback 配置文件编写

Logback 配置

本文讲logback的xml文件的配置,其中主要是在介绍各类appender。

logback 的简单例子

xml文件大概结构 导图链接

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");
    }
}

相关文章

引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满足人的生产生活需要而产生的。具体...
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章...
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章...
http://blog.jobbole.com/79252/ 引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满...
(点击上方公众号,可快速关注) 公众号:smart_android 作者:耿广龙|loonggg 点击“阅读原文”,可查看...
一、xml与xslt 相信所有人对xml都不陌生,其被广泛的应用于数据数据传输、保存与序列化中,是一种极为强...