抽奖系统中 Logback 的日志配置文件说明
logback-spring.xml 这个 XML 文件是 Logback 的日志配置文件,用于 Java 应用(结合 Spring Boot)根据不同环境(开发、测试、生产)配置日志输出策略。下面从整体结构到具体细节进行详细解释
1. 基础配置(根节点 configuration)
<configuration scan="true" scanPeriod="60 seconds" debug="false">
scan="true"
:开启配置文件自动扫描,当配置文件修改后,Logback 会自动重新加载配置(无需重启应用)。scanPeriod="60 seconds"
:扫描配置文件变化的间隔时间(这里为 60 秒)。debug="false"
:是否输出 Logback 自身的调试日志(false
表示不输出,避免干扰应用日志)。
2. 按环境区分配置(springProfile 标签)
Logback 结合 Spring Boot 的spring.profiles.active
机制,通过springProfile
标签为不同环境(dev
、prod
、test
)配置不同的日志策略。
2.1 开发环境(dev)配置
<springProfile name="dev"><!-- 输出到控制台 --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n%ex</pattern></encoder></appender><root level="info"><appender-ref ref="console" /></root></springProfile>
作用:开发环境下,日志直接输出到控制台(方便开发调试)。
核心组件:
appender
(日志输出器):name="console"
:给输出器命名(唯一标识)。class="ConsoleAppender"
:指定输出器类型为 “控制台输出”。encoder
(编码器):定义日志的格式和编码。pattern
(日志格式):%d{HH:mm:ss}
:日志时间(时分秒)。[%thread]
:当前线程名。%-5level
:日志级别(左对齐,占 5 个字符,如INFO
、ERROR
)。%logger{36}
:日志所属的类名(最多显示 36 个字符,避免过长)。%msg
:日志消息内容。%n
:换行。%ex
:异常堆栈信息(如果有异常)。
root
(根日志器):level="info"
:定义日志输出的级别(info
及以上级别日志会被处理,info
以下的debug
、trace
会被忽略)。appender-ref
:引用名为console
的输出器,即 “将符合级别的日志通过 console 输出器输出”。
2.2 生产 / 测试环境(prod / test)配置
<springProfile name="prod,test"><!-- 定义日志路径、应用名等变量 --><property name="logback.logErrorDir" value="/root/lottery-system/logs/error"/><property name="logback.logInfoDir" value="/root/lottery-system/logs/info"/><property name="logback.appName" value="lotterySystem"/><contextName>${logback.appName}</contextName><!-- ERROR级别日志配置 --><appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">...</appender><!-- INFO级别日志配置 --><appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">...</appender><root level="info"><appender-ref ref="fileErrorLog" /><appender-ref ref="fileInfoLog"/></root>
</springProfile>
- 作用:生产和测试环境下,日志按级别输出到不同文件,并自动归档(避免日志文件过大或占用过多磁盘空间)。
- tip:下面的文件路径根据自己云服务器的配置改写
(1)变量定义(property
标签)
logback.logErrorDir
:ERROR 级别日志的存储目录(/root/lottery-system/logs/error
)。logback.logInfoDir
:INFO 级别日志的存储目录(/root/lottery-system/logs/info
)。logback.appName
:应用名称(lotterySystem
),用于区分不同应用的日志。contextName
:设置 Logback 的上下文名称(关联应用名,便于多应用日志区分)。
(2)ERROR 级别日志输出器(fileErrorLog
)
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 当前日志文件路径(当天的ERROR日志) --><File>${logback.logErrorDir}/error.log</File><!-- 过滤器:只保留ERROR级别日志 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch> <!-- 匹配ERROR级别时,接受日志 --><onMismatch>DENY</onMismatch> <!-- 不匹配时,拒绝日志 --></filter><!-- 滚动策略(日志归档规则) --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 归档文件命名格式(按日期拆分) --><FileNamePattern>${logback.logErrorDir}/error.%d{yyyy-MM-dd}.log</FileNamePattern><maxHistory>14</maxHistory> <!-- 保留最近14天的归档日志, older日志自动删除 --><!-- <totalSizeCap>1GB</totalSizeCap> --> <!-- 可选:日志总大小上限(超过后删除旧日志) --></rollingPolicy><!-- 日志格式编码 --><encoder><charset>UTF-8</charset> <!-- 字符编码(避免中文乱码) --><pattern>%d [%thread] %-5level %logger{36} %line - %msg%n%ex</pattern></encoder>
</appender>
- 核心说明:
RollingFileAppender
:滚动文件输出器,支持日志文件自动拆分和归档(避免单个文件过大)。File
:当前正在写入的日志文件(当天的 ERROR 日志会写入error.log
)。filter
(级别过滤器):通过LevelFilter
确保只有ERROR
级别日志会被该输出器处理(其他级别如INFO
、WARN
会被拒绝)。rollingPolicy
(滚动策略):TimeBasedRollingPolicy
:按时间拆分日志(这里按 “天” 拆分)。FileNamePattern
:归档文件命名规则(如error.2025-08-03.log
表示 2025 年 8 月 3 日的 ERROR 日志)。maxHistory
:控制日志保留时长(14 天),避免磁盘被旧日志占满。
encoder
:charset="UTF-8"
:强制 UTF-8 编码,解决中文日志乱码问题。pattern
:比开发环境多了%line
(日志所在代码行号),便于定位问题。
(3)INFO 级别日志输出器(fileInfoLog
)
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 当前日志文件路径(当天的INFO日志) --><File>${logback.logInfoDir}/info.log</File><!-- 自定义过滤器:只保留INFO级别日志 --><filter class="com.example.lotterysystem.common.filter.InfoLevelFilter"/><!-- 滚动策略(与ERROR日志类似) --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${logback.logInfoDir}/info.%d{yyyy-MM-dd}.log</FileNamePattern><maxHistory>14</maxHistory></rollingPolicy><!-- 日志格式编码(与ERROR日志相同) --><encoder><charset>UTF-8</charset><pattern>%d [%thread] %-5level %logger{36} %line - %msg%n%ex</pattern></encoder>
</appender>
- 核心说明:
- 与
fileErrorLog
的区别在于过滤器:使用自定义过滤器InfoLevelFilter
(全限定类名com.example.lotterysystem.common.filter.InfoLevelFilter
),作用是只保留INFO
级别日志(拒绝WARN
、ERROR
等其他级别,确保info.log
中只有 INFO 日志)。 - 其他配置(滚动策略、格式)与
fileErrorLog
一致,确保日志按天归档,保留 14 天。
- 与
(4)根日志器(root
)
<root level="info"><appender-ref ref="fileErrorLog" /><appender-ref ref="fileInfoLog"/>
</root>
level="info"
:定义日志输出级别为info
及以上(info
、warn
、error
)。- 同时引用
fileErrorLog
和fileInfoLog
两个输出器:ERROR
级别日志会被fileErrorLog
处理(写入 ERROR 目录)。INFO
级别日志会被fileInfoLog
处理(写入 INFO 目录)。- (
WARN
级别日志会被两个过滤器同时拒绝,因此不会输出,这是由过滤器逻辑决定的)。
三、总结
该配置文件通过 Spring 环境隔离(springProfile
),实现了日志的 “环境差异化管理”:
- 开发环境(
dev
):日志输出到控制台,格式简洁,便于实时调试。 - 生产 / 测试环境(
prod,test
):日志按级别(INFO/ERROR)分离到不同文件,自动按天归档并保留 14 天,既保证了日志的可追溯性,又避免了磁盘空间浪费。
这种配置符合实际开发需求:开发时注重便捷性,生产时注重规范性和可管理性。