在springboot中配置日志文件非常简单,使用也很简单。稍微复杂的可能就是相关的logback.xml配置文件,下面我们对常见的日志配置文件进行解读
<configuration debug="false" scan="true" scanPeriod="3600 seconds">
<property name="LOG_HOME" value="logs"/>
<property name="ROOT_LOG_LEVEL" value="DEBUG"/>
<property name="FILE_LOG_LEVEL" value="DEBUG"/>
<property name="CONSOLE_LOG_LEVEL" value="DEBUG"/>
<property name="FILE_NAME" value="springbootlearn"/>
<property name="log.maxSize" value="100MB"/>
<property name="log.maxHistory" value="30"/>
<property name="FILE_LOG_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%X{traceId}] [%thread] %class{50}:%method : %msg%n">
property>
<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{50} - %msg%n"/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${CONSOLE_LOG_LEVEL}level>
filter>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}pattern>
<charset>UTF-8charset>
encoder>
appender>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${FILE_NAME}.logfile>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${FILE_LOG_LEVEL}level>
filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>
${LOG_HOME}/${FILE_NAME}.%d{yyyy-MM-dd}.%i.log.zip
fileNamePattern>
<maxHistory>${log.maxHistory}maxHistory>
<maxFileSize>${log.maxSize}maxFileSize>
rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}pattern>
<charset>UTF-8charset>
encoder>
appender>
<logger name="org.springframework.web" level="DEBUG"/>
<logger name="com.xxc.learnboot" level="DEBUG"/>
<root level="${ROOT_LOG_LEVEL}">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
root>
configuration>
解读如下:
好的,我们来详细分析一下你提供的这个 logback-spring.xml
配置文件。这是一个相当标准和功能完善的 Logback 配置。
这个配置文件定义了日志的输出行为,包括:
org.springframework.web
) 和你自己的应用包 (com.xxc.learnboot
) 设置了特定的日志级别。
元素
<configuration debug="false" scan="true" scanPeriod="3600 seconds">
debug="false"
: 这意味着 Logback 内部的调试信息不会被打印。在生产环境中通常设置为 false
。如果遇到 Logback 配置不生效的问题,可以临时设置为 true
来查看 Logback 的加载和运行状态。scan="true"
: 启用配置文件的自动扫描和重载。如果 logback-spring.xml
文件在运行时被修改,Logback 会检测到变化并重新加载配置,无需重启应用。这在开发和需要动态调整日志级别的场景下很有用。scanPeriod="3600 seconds"
: 设置扫描配置文件变更的时间间隔为 3600 秒(1 小时)。当 scan="true"
时此属性生效。
元素 - 全局属性定义
<property name="LOG_HOME" value="logs"/>
<property name="ROOT_LOG_LEVEL" value="DEBUG"/>
<property name="FILE_LOG_LEVEL" value="DEBUG"/>
<property name="CONSOLE_LOG_LEVEL" value="DEBUG"/>
<property name="FILE_NAME" value="springbootlearn"/>
<property name="log.maxSize" value="100MB"/>
<property name="log.maxHistory" value="30"/>
LOG_HOME
: 定义日志文件存储的根目录为程序运行目录下的 logs
文件夹。ROOT_LOG_LEVEL
: 设置根 Logger 的默认级别为 DEBUG
。这意味着,除非特定 Logger 有更精确的设置,否则所有日志事件都将以 DEBUG
级别进行处理。FILE_LOG_LEVEL
: 为文件 Appender 设置的阈值过滤器级别为 DEBUG
。CONSOLE_LOG_LEVEL
: 为控制台 Appender 设置的阈值过滤器级别为 DEBUG
。FILE_NAME
: 日志文件的基础名称为 springbootlearn
。最终文件名会是 springbootlearn.log
。log.maxSize
: 定义了单个日志文件的最大尺寸为 100MB
。当文件达到此大小时,会触发滚动。log.maxHistory
: 定义了日志文件保留的最大历史数量(或天数,取决于滚动策略)为 30
。
元素 - 日志格式定义
<property name="FILE_LOG_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%X{traceId}] [%thread] %class{50}:%method : %msg%n">
property>
<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{50} - %msg%n"/>
CONSOLE_LOG_PATTERN
:
%d{yyyy-MM-dd HH:mm:ss.SSS}
: 日期和时间。%highlight(%-5level)
: 高亮显示日志级别,左对齐,宽度为5。---
: 分隔符。%magenta([%X{traceId}])
: 紫色显示 MDC (Mapped Diagnostic Context) 中的 traceId
(如果存在)。这对于分布式追踪非常有用。[%thread]
: 当前线程名。%green(%class{50})
: 绿色显示类名,最大长度50,通常会自动缩写包名。%cyan(%method)
: 青色显示方法名。注意:输出方法名 %method
会有性能损耗,因为它需要生成调用者数据。在生产环境中应谨慎使用。%msg%n
: 日志消息和换行符。FILE_LOG_PATTERN
:
%d{yyyy-MM-dd HH:mm:ss.SSS}
: 日期和时间。%-5level
: 日志级别,左对齐,宽度为5。---
: 分隔符。[%X{traceId}]
: MDC 中的 traceId
。[%thread]
: 当前线程名。%class{50}
: 类名,最大长度50。%method
: 方法名。同样,注意性能影响。%msg%n
: 日志消息和换行符。CONSOLE_LOG_PATTERN
:
%d{yyyy-MM-dd HH:mm:ss.SSS}
: 日期和时间。%-5level
: 日志级别,左对齐,宽度为5。%logger{50}
: Logger 名称(通常是类名),最大长度50。与 %class
类似,但 %logger
是 Logger 的名字,而 %class
是事件发生处的类名。在简单情况下它们可能相同。- %msg%n
: 分隔符、日志消息和换行符。
- 控制台输出器
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${CONSOLE_LOG_LEVEL}level>
filter>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}pattern>
<charset>UTF-8charset>
encoder>
appender>
class="ch.qos.logback.core.ConsoleAppender"
: 指定这是一个向控制台输出日志的 Appender。
: 添加了一个阈值过滤器。
${CONSOLE_LOG_LEVEL}
: 当前设置为 DEBUG
。这意味着只有级别为 DEBUG
或更高级别 (INFO, WARN, ERROR) 的日志事件才会通过此过滤器,从而被这个 Appender 处理(即打印到控制台)。TRACE 级别的日志将不会在控制台显示。
: 配置日志的格式化方式。
${CONSOLE_LOG_PATTERN}
: 使用前面定义的控制台日志格式。UTF-8
: 设置字符编码为 UTF-8,以避免乱码。
- 文件输出器
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${FILE_NAME}.logfile>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${FILE_LOG_LEVEL}level>
filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>
${LOG_HOME}/${FILE_NAME}.%d{yyyy-MM-dd}.%i.log.zip
fileNamePattern>
<maxHistory>${log.maxHistory}maxHistory>
<maxFileSize>${log.maxSize}maxFileSize>
rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}pattern>
<charset>UTF-8charset>
encoder>
appender>
class="ch.qos.logback.core.rolling.RollingFileAppender"
: 指定这是一个会将日志写入文件,并支持日志滚动的 Appender。${LOG_HOME}/${FILE_NAME}.log
: 当前活动日志文件的路径和名称,例如 logs/springbootlearn.log
。
: 同样使用了阈值过滤器。
${FILE_LOG_LEVEL}
: 当前设置为 DEBUG
。这意味着只有级别为 DEBUG
或更高级别的日志才会写入文件。
: 配置日志滚动策略,这里是基于时间和大小的滚动。
${LOG_HOME}/${FILE_NAME}.%d{yyyy-MM-dd}.%i.log.zip
: 定义了归档日志文件的命名模式。
%d{yyyy-MM-dd}
: 按日期滚动,每天一个新文件。%i
: 当天内如果日志文件大小超过 maxFileSize
,则通过递增索引 %i
(0, 1, 2…) 来创建新的分割文件。.zip
: 归档的日志文件会被压缩成 zip 格式,以节省磁盘空间。${log.maxHistory}
: 保留最近 30
天(或30个归档文件,取决于具体策略如何解释)的日志文件。${log.maxSize}
: 单个日志文件的最大大小为 100MB
。超过此大小会触发滚动(如果仍在同一天,则索引 %i
增加)。
: 文件日志的编码器。
${FILE_LOG_PATTERN}
: 使用前面定义的文件日志格式。UTF-8
: 字符编码。
元素 - 特定包的日志级别
<logger name="org.springframework.web" level="DEBUG"/>
<logger name="com.xxc.learnboot" level="DEBUG"/>
: 将 org.springframework.web
包(及其子包)下的所有 Logger 的级别设置为 DEBUG
。这将输出 Spring MVC 处理请求的详细信息。
: 将 com.xxc.learnboot
包(及其子包)下的所有 Logger 的级别设置为 DEBUG
。这是你应用程序主包的日志级别设置。
元素没有指定 additivity="false"
。这意味着,除了它们自己处理日志事件外,这些事件还会向上传播到父 Logger(最终到 root Logger)。由于 root Logger 也配置了 console 和 file Appender,这意味着 org.springframework.web
和 com.xxc.learnboot
的 DEBUG 及以上级别的日志,可能会在控制台和文件中各输出一次(一次由这个logger自己的appender(如果配置了),一次由root logger的appender)。不过,因为这些特定的 logger 元素没有自己的 appender-ref
,所以它们实际上是依赖 root logger 的 appender 来输出。这里的设置主要是为了覆盖 root logger 的级别。
元素 - 根 Logger
<root level="${ROOT_LOG_LEVEL}">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
root>
level="${ROOT_LOG_LEVEL}"
: 设置根 Logger 的级别为 DEBUG
(通过属性 ${ROOT_LOG_LEVEL}
获取)。这是所有 Logger 的最终默认级别,除非被更具体的
元素覆盖。
: 将名为 “console” 的 Appender 附加到根 Logger。
: 将名为 “file” 的 Appender 附加到根 Logger。DEBUG
及以上的日志事件(未被特定 logger 拦截或其 additivity 设置为 false 的)都会同时输出到控制台和日志文件。DEBUG
。这在开发阶段非常有用,可以获取大量信息。但在生产环境中,通常会将默认级别调整为 INFO
或 WARN
,以避免产生过多的日志,影响性能和存储。DEBUG
级别可以按需为特定故障排除的包开启。%method
):文件日志格式中使用了 %method
。如前所述,获取方法名会有性能开销。在生产环境的高吞吐量场景下,如果性能敏感,可以考虑移除或仅在需要详细调试时开启。traceId
的使用:日志格式中包含了 [%X{traceId}]
。这是一个很好的实践,用于在分布式系统中追踪请求。你需要确保在代码中通过 MDC.put("traceId", "your-trace-id")
来设置它,通常在请求进入时设置,在请求结束时清理。Spring Cloud Sleuth 或 Micrometer Tracing 等库可以自动处理这个。console
和 file
Appender 都设置了 ThresholdFilter
。这个过滤器的作用是只允许等于或高于指定级别的日志通过。CONSOLE_LOG_LEVEL
是 DEBUG
,那么 TRACE
日志即使被某个 Logger 允许(比如 Logger 的级别是 TRACE),也不会被 console
Appender 打印。
和
,由于没有设置 additivity="false"
,它们的日志事件会由 root logger 的 appender (console 和 file) 处理。这是常见的做法。如果只想让特定 logger 的日志输出到特定 appender,而不是也通过 root logger 输出,则需要使用 additivity="false"
并为该 logger 单独配置 appender-ref
。SizeAndTimeBasedRollingPolicy
是一个很好的选择,既能按天归档,也能在当天日志量过大时进行分割,并且支持压缩。scan
和 scanPeriod
:设置为1小时扫描一次,对于生产环境来说是一个合理的折衷。过于频繁的扫描也会有轻微的性能影响。总的来说,这是一个结构良好、功能强大的 Logback 配置文件,特别适合 Spring Boot 应用。你只需要根据部署环境(开发、测试、生产)适当调整日志级别相关的属性即可。
以下面这条日志为例
2025-05-23 21:03:20.355 DEBUG com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Before shutdown stats (total=10/10, idle=10/10, active=0, waiting=0)
com.zaxxer.hikari
这个包名通常指向 HikariCP。
HikariCP 是一个非常高性能的 JDBC (Java Database Connectivity) 连接池库。
用途和重要性:
你看到的日志 2025-05-23 21:03:20.355 DEBUG com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Before shutdown stats (total=10/10, idle=10/10, active=0, waiting=0)
就是 HikariCP 在关闭其连接池(名为 HikariPool-1
)之前打印的一些统计信息,比如总连接数、空闲连接数、活动连接数等。这些 DEBUG 级别的日志对于监控连接池的状态和诊断问题非常有用,但在正常运行的生产环境中,你可能不希望看到如此频繁或详细的连接池内部日志。
com.zaxxer.hikari
包的日志输出要在你提供的 logback-spring.xml
配置文件中实现对 com.zaxxer.hikari
包下的所有日志不输出打印,你需要在
标签内,通常是在其他
标签附近或者
标签之前,添加一个新的
配置。
我们将为 com.zaxxer.hikari
包设置一个专门的 logger,并将其日志级别设置为 OFF
。OFF
级别会关闭该 logger 的所有日志记录。
修改说明:
我们在
之后,以及
之前,添加了以下行:
<logger name="com.zaxxer.hikari" level="OFF"/>
name="com.zaxxer.hikari"
: 指定这个 logger 配置应用于 com.zaxxer.hikari
包及其所有子包。level="OFF"
: 将这个 logger 的级别设置为 OFF
。OFF
是最高级别,它会关闭所有日志消息(TRACE, DEBUG, INFO, WARN, ERROR)。因此,任何源自 com.zaxxer.hikari
包的日志事件都不会被记录或打印。重要提示:
Additivity:默认情况下,
元素的 additivity
属性是 true
,这意味着日志事件在被这个 logger 处理后,还会向上传递给父 logger(最终到 root logger)。但是,因为我们将级别设置为 OFF
,这个 logger 本身就不会产生任何日志事件传递给它的 appender(如果有的话)或父 logger 的 appender。所以,即使 additivity
是 true
,com.zaxxer.hikari
的日志也不会输出。如果你想更明确地表示这个 logger 不会将任何(即使是其他级别)事件传递给 root logger 的 appender,你可以添加 additivity="false"
,但对于 level="OFF"
来说,这通常不是必需的。
这样修改后,com.zaxxer.hikari
包下的所有日志(包括你示例中提到的 DEBUG 日志)都将被忽略,不会输出到控制台或日志文件中。