抽奖系统中 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 天,既保证了日志的可追溯性,又避免了磁盘空间浪费。
这种配置符合实际开发需求:开发时注重便捷性,生产时注重规范性和可管理性。
