Java日志记录框架Logback详解

为什么使用logback

记得前几年工作的时候,公司使用的日志框架还是log4j,大约从16年中到现在,不管是我参与的别人已经搭建好的项目还是我自己主导的项目,日志框架基本都换成了logback,总结一下,logback大约有以下的一些优点:

内核重写、测试充分、初始化内存加载更小,这一切让logback性能和log4j相比有诸多倍的提升

logback非常自然地直接实现了slf4j,这个严格来说算不上优点,只是这样,再理解slf4j的前提下会很容易理解logback,也同时很容易用其他日志框架替换logback

logback有比较齐全的200多页的文档

logback当配置文件修改了,支持自动重新加载配置文件,扫描过程快且安全,它并不需要另外创建一个扫描线程

支持自动去除旧的日志文件,可以控制已经产生日志文件的最大数量

总而言之,如果大家的项目里面需要选择一个日志框架,那么我个人非常建议使用logback。

logback加载

我们简单分析一下logback加载过程,当我们使用logback-classic.jar时,应用启动,那么logback会按照如下顺序进行扫描:

在系统配置文件System Properties中寻找是否有logback.configurationFile对应的value

在classpath下寻找是否有logback.groovy(即logback支持groovy与xml两种配置方式)

在classpath下寻找是否有logback-test.xml

在classpath下寻找是否有logback.xml

以上任何一项找到了,就不进行后续扫描,按照对应的配置进行logback的初始化,具体代码实现可见ch.qos.logback.classic.util.ContextInitializer类的findURLOfDefaultConfigurationFile方法。

当所有以上四项都找不到的情况下,logback会调用ch.qos.logback.classic.BasicConfigurator的configure方法,构造一个ConsoleAppender用于向控制台输出日志,默认日志输出格式为"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"。

logback的configuration

logback的重点应当是Appender、Logger、Pattern,在这之前先简单了解一下logback的<configuration>,<configuration>只有三个属性:

scan:当scan被设置为true时,当配置文件发生改变,将会被重新加载,默认为true

scanPeriod:检测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认为毫秒,当scan=true时这个值生效,默认时间间隔为1分钟

debug:当被设置为true时,将打印出logback内部日志信息,实时查看logback运行信息,默认为false

<logger>与<root>

先从最基本的<logger>与<root>开始。

<logger>用来设置某一个包或者具体某一个类的日志打印级别、以及指定<appender>。<logger>可以包含零个或者多个<appender-ref>元素,标识这个appender将会添加到这个logger。<logger>仅有一个name属性、一个可选的level属性和一个可选的additivity属性:

name:用来指定受此logger约束的某一个包或者具体的某一个类

level:用来设置打印级别,五个常用打印级别从低至高依次为TRACE、DEBUG、INFO、WARN、ERROR,如果未设置此级别,那么当前logger会继承上级的级别

additivity:是否向上级logger传递打印信息,默认为true

<root>也是<logger>元素,但是它是根logger,只有一个level属性,因为它的name就是root。

接着写一段代码来测试一下:

public class Slf4jTest {

@Test
    public void testSlf4j() {
        Logger logger = LoggerFactory.getLogger(Object.class);
        logger.trace("=====trace====="); 
        logger.debug("=====debug====="); 
        logger.info("=====info====="); 
        logger.warn("=====warn====="); 
        logger.error("=====error====="); 
    }
   
}

logback.xml的配置为:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="false" scanPeriod="60000" debug="false">
    <appender>
        <layout>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
        </layout>
    </appender>
   
    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>
   
</configuration>

root将打印级别设置为"info"级别,<appender>暂时不管,控制台的输出为:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8e687584a611807a04e52a0779e5ff97.html