springboot | SpringBoot 配置 logback 详解

本贴最后更新于 1759 天前,其中的信息可能已经渤澥桑田

JAVADEMO

Java 基础 Demo 站: https://www.javastudy.cloud
Java 中高级开发博客: https://www.lixiang.red
Java 学习公众号: Java 技术大本营
java_subscribe

logback 总述

​ 通常来说, 现在打日志一般会有三个选择, 1, log4j , 2. log4j2 , 3. logback. logback 现在 SpringBoot 中默认是选用 logback 的。 其使用 XML 进行配置

​ logback 官方文档如下: http://logback.qos.ch/manual/index.html

配置文件分段讲解

在 SpringBoot 项目中使用 logback 不需要别的配置,依赖也不需要额外引入,主要是配置文件的编写,在配置文件中,主要有以下几个节点

include

可以引入 jar 包中封装的 logback 配置,通过我们会引用 SpringBoot 包里面的一个默认文件

<include resource="org/springframework/boot/logging/logback/defaults.xml"/>

点开可以看到如下图所示 Spring 帮忙设定一些样式和 logger 级别配置:

U2Xhmm

property:

可以配置当前配置文件要使用到的变量

这里我们一般会用来定义目录和样式方便下面使用,如下所示

<property name="LOG_PATH" value="${user.home}/logs/java-study"/>
<property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS}|${LOG_LEVEL_PATTERN:-%5p}|${PID:- }|%t|%X{APP_NAME}|%X{IP}|%X{USER_NAME}|%X{TRACE_ID}|%-40.40logger{39} %line|%m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>

其中最主要的是 pattern,是日志配置中的灵魂!! 这里是小刀常用的一个格式

%d{yyyy-MM-dd HH:mm:ss.SSS} : 时间,精确到了毫秒

${LOG_LEVEL_PATTERN:-%5p} : 日志级别

PID : 线程号,可以观察到线程复用,对查 ThreadLocal 的问题很有用

%t : 线程名

%X{APP_NAME} : 应用名称,这个变量和下面的 IP, USER_NAME,TRACE_ID 都是通过 MDC 来实现的,在应用程序用通过调用下示方法来实现

import org.slf4j.MDC; 
MDC.put(TRACE_ID, traceId);

%X{IP} : 调用者的 ip

%X{USER_NAME} : 调用者的姓名

%X{TRACE_ID} : 一个请求跟踪的标识

%-40.40logger{39} : 打日志的类

%line : 在哪一行打的日志

%m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx : 日志详情

appender

各种各样的添加方案,通过配置这个,可以选择以大小分隔,或者以时间分隔之类等,可以理解为 Appender 是对日志本身的描述

在实际开发中,定义多少个 appender 需要看项目自己需要,一般来说,我们会定义一个错误日志的 appender , 控制台 appender , 和一个通用的 appender.

  • 错误日志的 appender 如下所示:
<appender name="ERRORLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_PATH}/error.log</file>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>ERROR</level>
    </filter>
    <encoder>
        <pattern>${PATTERN}</pattern>
        <charset>utf8</charset>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
        <!-- 超过180天的备份文件会被删除 -->
        <maxHistory>180</maxHistory>
    </rollingPolicy>
</appender>

这里要注意这几个地方:

  1. appender class="ch.qos.logback.core.rolling.RollingFileAppender" 这里可以配置不同的类来输出日志,这里选用了常用的 RollingFileAppender 当达到下面的 rollingPolicy 条件时,可以自动一个新的日志文件输出
  2. filter class="ch.qos.logback.classic.filter.ThresholdFilter" 一个阀值过滤器,只有达到这个阀值的日志才会在这个 appender 中输出
  3. rollingPolicy 和上面的 1 配合使用,有根据大小分割的,也有基于时间来分割的。这里选用了基于时间来分。
  • 控制台日志

控制台日志就很简单,只是在 idea 中和服务器/k8s 的终端上看的

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"  >
    <encoder>
        <pattern>${PATTERN}</pattern>
        <charset>utf8</charset>
    </encoder>
</appender>

logger

这个是和我们应用程序相关的,配置哪个目录的日志使用哪种 appender 来打印

logger 可以和我们 Spring 的环境配合起来使用,如下所示:

<springProfile name="online">
    <logger name="cloud.javastudy" level="ERROR" additivity="true">
        <appender-ref ref="ERRORLOG"/>
    </logger>

    <root level="INFO">
        <appender-ref ref="APPLICATION"/>
        <appender-ref ref="CONSOLE"/>
    </root>
</springProfile>

<springProfile name="!online">
    <logger name="cloud.javastudy" level="DEBUG" additivity="true">
        <appender-ref ref="CONSOLE"/>
    </logger>
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>
</springProfile>

有几下几点需要注意:

  • springProfile name="online" 这里是和我们 SpringBoot 的 application-online.properties 相对应的,可以用来区分开发/测试/线上环境
  • additivity="true" 这个是配置是否向上传递。 如果为 true, 在这个 logger 中打了之后, 还会继续往后匹配,如果为 false,则这个 logger 打了之后就结束了

root

这个是兜底方案,如果对某个目录的日志没有做配置,则使用 root 的方案进行输出

总结

logback 的配置总体来说不算复杂,明确好每个节点的分工,然后根据自己的业务需要来进行配置, 然后边配边观察输出,官方文档非常良心,问题和配置都可以在文档中找到详细说明,加油吧!

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3186 引用 • 8212 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    942 引用 • 1459 回帖 • 31 关注
  • logback
    4 引用 • 1 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...