基于SpringBoot Logback基础介绍

一. 配置入口

1.1 logback入口

Logback支持XML、Groovy的配置方式,以XML来说,它会默认查找resources目录下的logback-test.xml(用于测试)/logback.xml文件。

1.2 springboot 入口

使用logback-spring.xml文件进行配置
logback-spring.xml是由 Spring Boot 找到,插入自己的上下文信息,进一步处理后传递给Logback的.

  <springProfile> Env </springProfile> -- 区分环境
  <springProperty scope="context" name="APP_NAME" 
        source="spring.application.name"/> -- 获取spring上下文信息

二. logback-spring 配置简介

2.1 configuration

最外层的父标签,其中有几个属性配置(如: debug = true ) .但项目中较少使用.

2.2 property、springProperty、define

定义变量.

property 变量值通常为 常量、 xml上下文定义的变量 和Logback内建支持的上下文变量。(https://logback.qos.ch/manual/configuration.html#variableSubstitution

springProperty 变量值可以拿到Spring上下文属性。定义后,可以供property使用。

<define> 可以通过代码返回 变量值

<define name="ip" class="com.test.IPLogPropertyDefiner" />

public class IPLogPropertyDefiner extends PropertyDefinerBase {
   public IPLogPropertyDefiner() {
   }

   public String getPropertyValue() {
       return ServerConstants.SERVER_IP_ADDRESS;
   }
}

2.3 appender

定义日志输出到哪里,一般是写到文件。
logback提供了多种Appender. 常用两种:

  1. ch.qos.logback.core.rolling.RollingFileAppender负责将日志滚动打印
  2. ch.qos.logback.classic.AsyncAppender负责将日志异步打印,避免大量打印日志时阻塞线程。
    详细介绍看官方文档:https://logback.qos.ch/manual/appenders.html
 <property name="pattern"
              value="%d{HH:mm:ss.SSS} [%boldYellow(%-15.15thread)] [%X{MDC_LOG_ID}] %highlight(%-5level) %boldGreen(%-40.40logger{39})  - %msg %n"/>
<appender name="rolllingByDay" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>test.log</file>
    <encoder>
        <pattern>${pattern}</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>test.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
        <maxHistory>30</maxHistory>
        <maxFileSize>200MB</maxFileSize>
        <totalSizeCap>10GB</totalSizeCap>
    </rollingPolicy>
</appender>
<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
    <queueSize>256</queueSize>
    <discardingThreshold>0</discardingThreshold>
    <neverBlock>true</neverBlock>
    <appender-ref ref="rolllingByDay"/>
</appender>

2.4 logger 和 root

针对上一章中 某个Logger或者某个Logger集合 ,设置日志级别。
root 是所有Logger的默认设置。

<logger level="INFO" additivity="false" name="com.qb.user.UserDemo">
    <appender-ref ref="rolllingByDay"/>
</logger>
<root level="INFO">
    <appender-ref ref="async"/>
</root>

name支持最长前缀匹配原则。
如 假设我们定义了三个 logger com.qb.user.UserDemo,com.qb.user,com.qb. 对于
name = com.qb.user.UserDemo 的Logger实例,优先匹配到com.qb.user.UserDemo。

additivity属性最好设置为false. 如果为true。 对于上位的com.qb.user.UserDemoLogger实例,其日志可能打印三份。

2.5 springProfile

用于支持不用环境使用不用日志级别。 如 日常测试DEBUG,预发和线上使用INFO级别。

 <springProfile name="daily">
        <root level="DEBUG">
            <appender-ref ref="async"/>
        </root>
   </springProfile>
 <springProfile name="pre,prod">
        <root level="INFO">
            <appender-ref ref="async"/>
        </root>
   </springProfile>

三. 占位符

上文2.3章节中,我们通过 {pattern} 属性定义日志内容格式,其中用到了多种占位符。
详细可参考 https://logback.qos.ch/manual/layouts.html#conversionWord 。下文介绍常用的占位符。

%logger:   定义Logger实例name 
简写:c/ lo

%message:输出你实际要打印的日志信息
简写: %msg

%exception:输出异常堆栈,对应通过Slf4j传入的异常
简写%ex

%level:输出日志级别

%marker:输出通过Marker

%mdc:输出MDC
用法:mdc{key:-defaultVal} 等价 X{key:-defaultVal}

%date: 输出时间

%thread:线程

%n:换行

3.1. 输出长度

%占位符{length}:指定输出长度。
当实际长度小于指定长度,输出时,包名从最高级开始缩小到首字母,直到小于等于指定长度,最后一级不会缩短。
[%logger{0}]:只保留最后一级,且不会被缩短

3.2. 格式修饰

% 和占位符中间,还有一个用于控制格式的可选配置,正负数字+点+正负数字。
第一个数字表示:最小输出长度。
第二个数字表示:最大输出长度。
第一个数字前的正负表示:实际长度小于最小长度时,左空格补齐或右空格补齐。默认正——左侧填充空格,即右对齐。
第二个数字前的正负表示:实际长度大于最大输出长度时,左或右先裁剪。默认正——先左裁剪,右保留。举例:

[%-5,-10logger]:com.foo.bar.Service-->[com.foo.ba],最大10个字符,优先保留左侧字符
[%-5,10logger]:  com.foo.bar.Service--> [ar.Service],最大10个字符,优先保留右侧字符

四、MDC 中的 traceId
代码:

String traceId = IdUtil.fastSimpleUUID();
MDC.put(MDC_TRACE_ID, traceId);

日志:

[%X{MDC_LOG_ID}]
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容