logback讲解

配置文件

先讲讲这个配置文件的故事。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{MM/dd/yyyy HH:mm:ss} %-5level [%thread%X{sourceThread}]%logger{24} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/var/log/admin-manage/log.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/var/log/admin-manage/log.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{MM/dd/yyyy HH:mm:ss} %-5level ${version} [%thread]%logger{16} - %msg%n
            </pattern>
        </encoder>
    </appender>

    <logger name="test1" level="info"/>
    <logger name="test2" level="info" additivity="false"/>
    <logger name="test3" level="warn" additivity="false">
        <appender-ref ref="STDOUT"/>
    </logger>
    <logger name="test4" level="warn" >
        <appender-ref ref="STDOUT"/>
    </logger>
        <logger name="test4.test5" level="warn" >
        <appender-ref ref="STDOUT"/>
    </logger>
    <root level="DEBUG">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

1、appender

appender 表示日志要输出到哪里的组件。name=”STDOUT” 表示 这个输出的唯一标识符,class=”ch.qos.logback.core.ConsoleAppender” 表示这个输出由那些类来负责格式,encoder用来将日志信息解析成具有一定格式的信息,其中额外指定了自己想要的class,这个class用来填写 日期、线程名等等,这里面很多信息都是靠class 来完成的,其中”pattern”是表示输出的具体格式,输出的格式,%d表示日期,%d{MM/dd/yyyy HH:mm:ss} 表示以MM/dd/yyyy HH:mm:ss 这个格式显示当前时间,%thread表示线程名,%-5:级别从左显示5个字符宽度,level是日志级别,%msg:日志消息,%n是换行符。
其中第二个名为“FILE”的输出名称,类型为ch.qos.logback.core.rolling.RollingFileAppender的appender,这是一个可以将日志输出到一个文件的appender,并且可以按照日期将日志进行整理滚动,整理到各个文件中,不至于让所有日志都写在一个文件上。rollingPolicy是一种文件滚动策略,可以让日志文件按日或按月归档。上面的配置表示按照每天生成日志文件,最多保留7天,日志文件存放在/var/log/admin-manage/log.log。每过一天,日志文件名就变成类似log.2018-03-22.log.gz的形式,将日志按天或者按周进行分配,这些都可以设置。

2、logger

只配置appender是不能输出日志的,appender是要给logger用的,必须配置logger。
首先要清楚一些内容:
- 每个logger都是ch.qos.logback.classic.Logger的一个实例,
- 每个logger有一个名称,类似java 包名一样,作为唯一标识符,同样也是一个路径名,所有的名称可以组成一个树状,比如“test.test1.test2”,test1的父节点是test,test1的子节点是test2,这样的层级关系到日志的输出,因为test2的日志是可以传染的,从test2传染到test,“additivity=true”表明这种日志信息可以传递,不设置就默认为true,为false 则表明日志不传输。
- 每个logger有一个级别,一共有四个级别可选,分别是debug、info、warn、error;等级从低往高,level=”info”就是设置级别。
- 每个logger有0个或多个appender,这意味着同一条日志信息可以同时输出到多个地方去,可以将不同的信息输出到不同的文件中,这样可以方便收集主要信息。
- < root level=”DEBUG”> 这是所有logger的父节点,它的级别是debug,表明所有子节点的输出信息都可以传输到这里来。

logger输出

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * ${todo}
 *
 * @author 
 * @param: $$params$
 * @return $returns$
 * @date $date$ $time$
 */
public class LogBackTestOne {
    private static final Logger logger = LoggerFactory.getLogger(LogBackTestOne.class);

    public static void main(String[] arg) {
        print("test1");
        print("test2");
        print("test3");
        print("test4");
        print("test4.test5");
    }

    public static void print(String name) {
        Logger logger = LoggerFactory.getLogger(name);
        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
    }
}

输出结果:

05/02/2018 21:52:49 INFO  [main]test1 - info
05/02/2018 21:52:49 WARN  [main]test1 - warn
05/02/2018 21:52:49 ERROR [main]test1 - error
05/02/2018 21:52:49 WARN  [main]test3 - warn
05/02/2018 21:52:49 ERROR [main]test3 - error
05/02/2018 21:52:49 WARN  [main]test4 - warn
05/02/2018 21:52:49 WARN  [main]test4 - warn
05/02/2018 21:52:49 ERROR [main]test4 - error
05/02/2018 21:52:49 ERROR [main]test4 - error
05/02/2018 21:52:49 WARN  [main]test4.test5 - warn
05/02/2018 21:52:49 WARN  [main]test4.test5 - warn
05/02/2018 21:52:49 WARN  [main]test4.test5 - warn
05/02/2018 21:52:49 ERROR [main]test4.test5 - error
05/02/2018 21:52:49 ERROR [main]test4.test5 - error
05/02/2018 21:52:49 ERROR [main]test4.test5 - error

这里主要讲解一下test4.test5的输出,为什么warn和error是输出三次,为什么没有info和dbug输出?

  • 没有info和dubug输出,因为test4.test5的level=warn,这个优先级会过滤掉debug和info的信息,只输出warn和error类别的内容。
  • 为什么warn和error是输出三次,因为test4.test5的父节点有两个,一个是test4,另一个是root,所以这里是任何一个输出都要到这三个logger中,也就是输出三次了。

后续问题

有一些问题需要继续解决,
- 不同输出的logger能否可以输出到不同的路径文件下?

参考博客

一文理解logback

猜你喜欢

转载自blog.csdn.net/randompeople/article/details/80172868