springboot的logback配置源码解读

 更新时间:2023年11月01日 08:39:17   作者:codecraft  
这篇文章主要为大家介绍了springboot的logback配置,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

本文主要研究一下springboot的logback配置

defaults.xml

org/springframework/boot/logging/logback/defaults.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
Default logback configuration provided for import
-->
<included>
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
    <logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
    <logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
    <logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
    <logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
    <logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
    <logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
    <logger name="org.springframework.boot.actuate.endpoint.jmx" level="WARN"/>
</included>
spring-boot包含了defaults.xml,它定义了一些conversionRule、CONSOLE_LOG_PATTERN、FILE_LOG_PATTERN变量以及一些logger

console-appender.xml

org/springframework/boot/logging/logback/console-appender.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
Console appender logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
-->
<included>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
</included>
console-appender.xml定义了CONSOLE这个appender,其pattern取决于CONSOLE_LOG_PATTERN变量

file-appender.xml

org/springframework/boot/logging/logback/file-appender.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
File appender logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
-->
<included>
    <appender name="FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <cleanHistoryOnStart>${LOG_FILE_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
            <fileNamePattern>${ROLLING_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}</fileNamePattern>
            <maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
            <maxHistory>${LOG_FILE_MAX_HISTORY:-7}</maxHistory>
            <totalSizeCap>${LOG_FILE_TOTAL_SIZE_CAP:-0}</totalSizeCap>
        </rollingPolicy>
    </appender>
</included>
file-appender.xml定义了RollingFileAppender这个appender,其pattern取决于FILE_LOG_PATTERN,其file取决于LOG_FILE变量,rollingPolicy为SizeAndTimeBasedRollingPolicy,cleanHistoryOnStart默认为false,fileNamePattern默认为${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz},maxFileSize默认为10MB,maxHistory默认为7,totalSizeCap默认为0

base.xml

org/springframework/boot/logging/logback/base.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
Base logback configuration provided for compatibility with Spring Boot 1.1
-->
<included>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${xml.io.tmpdir:-/tmp}}}/spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</included>
base.xml引入了defaults.xml、console-appender.xml、file-appender.xml,它主要是定义了LOG_FILE路径,默认为${xml.io.tmpdir:-/tmp}}}/spring.log

logback.xml示例

<?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
        <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
        </root>
        <logger name="org.springframework.web" level="DEBUG"/>
    </configuration>

loadDefaults

org/springframework/boot/logging/logback/LogbackLoggingSystem.xml

@Override
    protected void loadDefaults(LoggingInitializationContext initializationContext, LogFile logFile) {
        LoggerContext context = getLoggerContext();
        stopAndReset(context);
        boolean debug = Boolean.getBoolean("logback.debug");
        if (debug) {
            StatusListenerConfigHelper.addOnConsoleListenerInstance(context, new OnConsoleStatusListener());
        }
        LogbackConfigurator configurator = debug ? new DebugLogbackConfigurator(context)
                : new LogbackConfigurator(context);
        Environment environment = initializationContext.getEnvironment();
        context.putProperty(LoggingSystemProperties.LOG_LEVEL_PATTERN,
                environment.resolvePlaceholders("${logging.pattern.level:${LOG_LEVEL_PATTERN:%5p}}"));
        context.putProperty(LoggingSystemProperties.LOG_DATEFORMAT_PATTERN, environment.resolvePlaceholders(
                "${logging.pattern.dateformat:${LOG_DATEFORMAT_PATTERN:yyyy-MM-dd HH:mm:ss.SSS}}"));
        context.putProperty(LoggingSystemProperties.ROLLING_FILE_NAME_PATTERN, environment
                .resolvePlaceholders("${logging.pattern.rolling-file-name:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}"));
        new DefaultLogbackConfiguration(initializationContext, logFile).apply(configurator);
        context.setPackagingDataEnabled(true);
    }
在没有logback.xml或者logback-spring.xml的时候,默认走的loadDefaults,它定义了LOG_LEVEL_PATTERN、LOG_DATEFORMAT_PATTERN、ROLLING_FILE_NAME_PATTERN,然后创建DefaultLogbackConfiguration并作用了LogbackConfigurator

DefaultLogbackConfiguration

org/springframework/boot/logging/logback/DefaultLogbackConfiguration.xml

class DefaultLogbackConfiguration {
    private static final String CONSOLE_LOG_PATTERN = "%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} "
            + "%clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} "
            + "%clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} "
            + "%clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}";
    private static final String FILE_LOG_PATTERN = "%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} "
            + "${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}";
    private static final DataSize MAX_FILE_SIZE = DataSize.ofMegabytes(10);
    private static final Integer MAX_FILE_HISTORY = 7;
    private final PropertyResolver patterns;
    private final LogFile logFile;
    DefaultLogbackConfiguration(LoggingInitializationContext initializationContext, LogFile logFile) {
        this.patterns = getPatternsResolver(initializationContext.getEnvironment());
        this.logFile = logFile;
    }
    void apply(LogbackConfigurator config) {
        synchronized (config.getConfigurationLock()) {
            base(config);
            Appender<ILoggingEvent> consoleAppender = consoleAppender(config);
            if (this.logFile != null) {
                Appender<ILoggingEvent> fileAppender = fileAppender(config, this.logFile.toString());
                config.root(Level.INFO, consoleAppender, fileAppender);
            }
            else {
                config.root(Level.INFO, consoleAppender);
            }
        }
    }
    //......
}
DefaultLogbackConfiguration类似于defaults.xml, console-appender.xml及file-appender.xml,不过它把相关配置直接写在代码里头省去xml解析,效率高一点;这里的apply代码显示执行base(config),再是创建consoleAppender,再创建fileAppender

小结

spring-boot定义了defaults.xml提供了conversion rules、CONSOLE_LOG_PATTERN、FILE_LOG_PATTERN变量及一些常用logger;console-appender.xml则定义了使用CONSOLE_LOG_PATTERN的ConsoleAppender;file-appender.xml则定义了使用FILE_LOG_PATTERN及ROLLING_FILE_NAME_PATTERN的RollingFileAppender;而base.xml是兼容旧版springboot定义的,它集成了defaults.xml、console-appender.xml、file-appender.xml;而新版的话默认是通过DefaultLogbackConfiguration来定义base、consoleAppender以及fileAppender的,省去xml解析,效率更高一点。

以上就是springboot的logback配置的详细内容,更多关于springboot logback配置的资料请关注脚本之家其它相关文章!

相关文章

  • java IO流 之 输入流 InputString()的使用

    java IO流 之 输入流 InputString()的使用

    这篇文章主要介绍了java IO流 之 输入流 InputString()的使用,以及读取数据的三种方式详解,非常不错,需要的朋友可以参考下
    2016-12-12
  • Spring Boot实现文件上传的两种方式总结

    Spring Boot实现文件上传的两种方式总结

    应用开发过程中,文件上传是一个基础的扩展功能,它的目的就是让大家共享我们上传的文件资源,下面这篇文章主要给大家总结介绍了关于Spring Boot实现文件上传的两种方式,需要的朋友可以参考下
    2023-05-05
  • Jmeter调用java脚本过程详解

    Jmeter调用java脚本过程详解

    这篇文章主要介绍了Jmeter调用java脚本过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • springcloud如何用Redlock实现分布式锁

    springcloud如何用Redlock实现分布式锁

    本文主要介绍了springcloud如何用Redlock实现分布式锁,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • MyBatis中如何查询某个时间段内的数据

    MyBatis中如何查询某个时间段内的数据

    这篇文章主要介绍了MyBatis中如何查询某个时间段内的数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 详解Maven环境的搭建与idea配置

    详解Maven环境的搭建与idea配置

    本篇文章主要介绍了详解Maven环境的搭建与idea配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • SpringBoot自定义maven-plugin插件整合asm代码插桩

    SpringBoot自定义maven-plugin插件整合asm代码插桩

    本文主要介绍了SpringBoot自定义maven-plugin插件整合asm代码插桩,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Java实现自定义自旋锁代码实例

    Java实现自定义自旋锁代码实例

    这篇文章主要介绍了Java实现自定义自旋锁代码实例,Java自旋锁是一种线程同步机制,它允许线程在获取锁时不立即阻塞,而是通过循环不断尝试获取锁,直到成功获取为止,自旋锁适用于锁竞争激烈但持有锁的时间很短的情况,需要的朋友可以参考下
    2023-10-10
  • Java Reflect如何利用反射获取属性上的注解

    Java Reflect如何利用反射获取属性上的注解

    AnnotatedElement接口是Java反射机制的一部分,用于读取运行中程序的注释信息,通过getAnnotation、getAnnotations、isAnnotationPresent和getDeclaredAnnotations方法,可以访问和判断注解,Field类实现了该接口
    2024-09-09
  • Java中的ThreadLocal线程变量详解

    Java中的ThreadLocal线程变量详解

    这篇文章主要介绍了Java中的ThreadLocal线程变量详解,ThreadLocal叫做线程变量,意思是在ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,它是用来提供线程内部的局部变量,需要的朋友可以参考下
    2024-01-01

最新评论