JAVADEMO
Java 基础 Demo 站: https://www.javastudy.cloud
Java 中高级开发博客: https://www.lixiang.red
Java 学习公众号: Java 技术大本营
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 级别配置:
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>
这里要注意这几个地方:
appender class="ch.qos.logback.core.rolling.RollingFileAppender"
这里可以配置不同的类来输出日志,这里选用了常用的RollingFileAppender
当达到下面的rollingPolicy
条件时,可以自动一个新的日志文件输出filter class="ch.qos.logback.classic.filter.ThresholdFilter"
一个阀值过滤器,只有达到这个阀值的日志才会在这个 appender 中输出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 的配置总体来说不算复杂,明确好每个节点的分工,然后根据自己的业务需要来进行配置, 然后边配边观察输出,官方文档非常良心,问题和配置都可以在文档中找到详细说明,加油吧!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于