尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Spring Boot 集成 Logback 日志框架:控制台与文件日志、按日期和大小拆分的实战配置

Spring Boot 集成 Logback 日志框架:控制台与文件日志、按日期和大小拆分的实战配置 Spring Boot 集成 Logback 日志框架控制台与文件日志、按日期和大小拆分的实战配置【免费下载链接】spring-boot-demo一个用来深入学习并实战 Spring Boot 的项目。项目地址: https://gitcode.com/gh_mirrors/sp/spring-boot-demo本篇文章基于 spring-boot-demo 项目中的 demo-logback 模块系统讲解如何在 Spring Boot 应用中集成 Logback 日志框架从 Maven 依赖、LombokSlf4j注解的使用到logback-spring.xml中 ConsoleAppender、RollingFileAppender、LevelFilter、ThresholdFilter 以及日期 大小双重滚动策略的完整配置。读完本文你将掌握一套可直接复用的生产级 Logback 配置方案实现控制台日志与文件日志并存、INFO 与 ERROR 日志分离归档、日志按天按大小自动拆分的完整能力。模块概览demo-logback 在项目中的定位demo-logback 是 spring-boot-demo 聚合工程根目录 pom.xml 中以moduledemo-logback/module声明下的一个独立子模块其目的是演示 Spring Boot 集成 Logback 后如何记录程序运行日志。整个模块结构十分精简demo-logback/ ├── pom.xml # Maven 构建配置 ├── src/main/java/com/xkcoding/logback/ │ └── SpringBootDemoLogbackApplication.java # 启动类含日志演示代码 ├── src/main/resources/ │ ├── application.yml # 应用配置端口 / 上下文路径 │ └── logback-spring.xml # Logback 核心配置 └── src/test/java/com/xkcoding/logback/ └── SpringBootDemoLogbackApplicationTests.java # 上下文加载测试该模块演示的核心能力可概括为三点同时输出控制台日志和文件日志文件日志按日期天和大小MB双重维度拆分归档INFO 与 ERROR 两类日志分文件记录互不污染。一、pom.xml最小化依赖组合模块的 pom.xml 继承了父工程com.xkcoding:spring-boot-demo:1.0.0-SNAPSHOT父工程版本管理见根目录 pom.xml其中spring.boot.version为2.1.0.RELEASE、java.version为1.8自身只声明了三个依赖dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies要点说明不需要显式引入 Logback 依赖。Spring Boot 的spring-boot-starter-logging已默认集成 Logback且被spring-boot-starter-web传递引入开箱即用。spring-boot-starter-web为本模块提供 Web 容器能力同时带来默认日志依赖lombok提供Slf4j注解自动生成log静态字段简化日志对象获取spring-boot-starter-testscope 为 test用于支撑 SpringBootDemoLogbackApplicationTests.java 中的上下文加载测试。二、启动类五种日志级别与异常堆栈的输出演示SpringBootDemoLogbackApplication.java 是整个演示的核心代码它用Slf4j注入log对象在应用启动后依次输出 TRACE、DEBUG、INFO、WARN、ERROR 五个级别的日志并主动触发一次除零异常来演示异常堆栈的记录SpringBootApplication Slf4j public class SpringBootDemoLogbackApplication { public static void main(String[] args) { ConfigurableApplicationContext context SpringApplication.run(SpringBootDemoLogbackApplication.class, args); int length context.getBeanDefinitionNames().length; log.trace(Spring boot启动初始化了 {} 个 Bean, length); log.debug(Spring boot启动初始化了 {} 个 Bean, length); log.info(Spring boot启动初始化了 {} 个 Bean, length); log.warn(Spring boot启动初始化了 {} 个 Bean, length); log.error(Spring boot启动初始化了 {} 个 Bean, length); try { int i 0; int j 1 / i; } catch (Exception e) { log.error(【SpringBootDemoLogbackApplication】启动异常, e); } } }这段代码包含两个值得注意的工程实践占位符{}传参日志消息使用{}占位符并传入length变量相比字符串拼接可避免在日志级别不满足输出条件时产生无谓的字符串创建开销异常堆栈输出log.error(..., e)将异常对象作为最后一个参数传入Logback 会自动打印完整堆栈。这里通过1 / 0触发ArithmeticException用于验证 ERROR 日志文件能够完整记录异常信息。日志级别之间存在大小关系TRACE DEBUG INFO WARN ERROR。在 root 级别配置为info的前提下TRACE 和 DEBUG 日志会被过滤掉最终只有 INFO、WARN、ERROR 三条正常日志和一条异常 ERROR 日志会进入输出——这一现象可以直接用来说明根级别决定全局日志下限的机制。三、logback-spring.xml生产级日志配置逐段拆解模块的完整配置文件位于 demo-logback/src/main/resources/logback-spring.xml。关于文件命名需要特别说明使用logback-spring.xml而非logback.xml是 Spring Boot 官方推荐做法。logback-spring.xml支持 Spring 扩展标签如springProfile并且不会被 Logback 原生加载器提前接管从而可以借助springProfile实现按环境dev/test/prod差异化配置该文件若放置于src/main/resources下Spring Boot 会自动发现并作为日志配置生效。3.1 引入 Spring Boot 默认日志基线configuration property nameFILE_ERROR_PATTERN value${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} %file:%line: %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}/ include resourceorg/springframework/boot/logging/logback/defaults.xml/include resourceorg/springframework/boot/logging/logback/defaults.xml/引入 Spring Boot 自带的基础配置其中定义了CONSOLE_LOG_PATTERN、FILE_LOG_PATTERN等默认输出模板变量保证与 Spring Boot 默认日志风格一致开头通过property自定义了FILE_ERROR_PATTERN用于 ERROR 日志文件。它复用了FILE_LOG_PATTERN的默认结构并追加了%file:%line输出日志产生的源文件与行号且各环节都提供了:-形式的默认值兜底即使外部没有定义环境变量也能正常渲染。3.2 控制台日志 AppenderLevelFilter 只保留 INFOappender nameCONSOLE classch.qos.logback.core.ConsoleAppender filter classch.qos.logback.classic.filter.LevelFilter levelINFO/level /filter encoder pattern${CONSOLE_LOG_PATTERN}/pattern charsetUTF-8/charset /encoder /appenderConsoleAppender负责向标准输出控制台写日志LevelFilter是精确匹配过滤器levelINFO/level表示仅当日志级别恰好等于INFO 时才放行LevelFilter 默认onMatchACCEPT、onMismatchDENY输出格式使用 Spring Boot 默认的CONSOLE_LOG_PATTERN编码为 UTF-8避免中文乱码。3.3 INFO 文件 AppenderLevelFilter 精确过滤掉 ERRORappender nameFILE_INFO classch.qos.logback.core.rolling.RollingFileAppender filter classch.qos.logback.classic.filter.LevelFilter levelERROR/level onMatchDENY/onMatch onMismatchACCEPT/onMismatch /filter rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy FileNamePatternlogs/demo-logback/info.created_on_%d{yyyy-MM-dd}.part_%i.log/FileNamePattern maxHistory90/maxHistory timeBasedFileNamingAndTriggeringPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedFNATP maxFileSize2MB/maxFileSize /timeBasedFileNamingAndTriggeringPolicy /rollingPolicy encoder pattern${FILE_LOG_PATTERN}/pattern charsetUTF-8/charset /encoder /appender这段配置在原文档中有一句非常关键的经验注释如果只是想要 Info 级别的日志只是过滤 info 还是会输出 Error 日志因为 Error 的级别高。也就是说不能简单地用等于 INFO的过滤来圈定 INFO 文件的范围——因为文件 Appender 收到的日志不受输出级别等于约束更高等级的 ERROR 也会流向这里。因此这里采用了反向策略LevelFilter匹配ERROR级别onMatchDENY一旦匹配到 ERROR 级别就拒绝onMismatchACCEPT其他级别INFO、WARN 等放行。这样 FILE_INFO 文件就能稳定地只保留 INFO 及其以下含 DEBUG 等按需放行的非 ERROR 日志而 ERROR 被单独导走。同时File标签被注释掉!--Filelogs/info.demo-logback.log/File--只保留FileNamePattern。原文档也给出了对应的解释如果同时配置File与FileNamePattern则当天的日志先写入File指定的文件次日滚动时再按FileNamePattern改名归档即File中始终是当天日志如果只配置FileNamePattern本模块的做法则所有日志直接按文件名模板生成不带固定活动文件。3.4 ERROR 文件 AppenderThresholdFilter 只保留 ERROR 及以上appender nameFILE_ERROR classch.qos.logback.core.rolling.RollingFileAppender filter classch.qos.logback.classic.filter.ThresholdFilter levelError/level /filter rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy FileNamePatternlogs/demo-logback/error.created_on_%d{yyyy-MM-dd}.part_%i.log/FileNamePattern maxHistory90/maxHistory timeBasedFileNamingAndTriggeringPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedFNATP maxFileSize2MB/maxFileSize /timeBasedFileNamingAndTriggeringPolicy /rollingPolicy encoder pattern${FILE_ERROR_PATTERN}/pattern charsetUTF-8/charset /encoder /appender与 INFO 文件形成对比的是ERROR 文件使用ThresholdFilter——它是阈值过滤levelError/level表示只放行级别大于等于 ERROR的日志即 ERROR 及其以上。这正是原文档注释中所说的如果只是想要 Error 级别的日志那么需要过滤一下默认是 info 级别的的含义文件 Appender 默认接收的是当前 logger 传入的所有日志若不设 ThresholdFilterINFO/WARN 会混入其中。值得留意的是ERROR 文件的 pattern 使用了自定义的FILE_ERROR_PATTERN它相比 INFO 文件多输出%file:%line便于问题定位。3.5 按日期 大小双重拆分的滚动策略INFO 与 ERROR 两个文件 Appender 的滚动策略一致都是时间 大小双重滚动rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy FileNamePatternlogs/demo-logback/info.created_on_%d{yyyy-MM-dd}.part_%i.log/FileNamePattern maxHistory90/maxHistory timeBasedFileNamingAndTriggeringPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedFNATP maxFileSize2MB/maxFileSize /timeBasedFileNamingAndTriggeringPolicy /rollingPolicy各配置项含义与取值如下配置项当前值作用rollingPolicyTimeBasedRollingPolicy按时间滚动以%d{yyyy-MM-dd}为维度每天一个日志归档周期FileNamePatternlogs/demo-logback/info.created_on_%d{yyyy-MM-dd}.part_%i.log定义归档文件命名规则%d为日期%i为同一日期内因大小触发拆分的序号maxHistory90只保留最近 90 天的日志过期日志自动清理防止磁盘被日志填满totalSizeCap注释状态示例给出1GB日志总容量上限超过则删除最旧日志按需启用timeBasedFileNamingAndTriggeringPolicySizeAndTimeBasedFNATP时间 大小复合触发在按天滚动的基础上叠加按大小滚动maxFileSize2MB单个活动日志文件的大小上限原文档注释说明 Logback 默认值为 10MB此处设置为 2MB 便于演示滚动效果达到该值后生成新的.part_%i.log文件此外配置中还以注释形式保留了另一种纯大小触发策略SizeBasedTriggeringPolicymaxFileSize1KB/maxFileSize供读者对比纯大小滚动与时间大小滚动的差异前者不关心日期、文件到达阈值即滚动后者则同时受日期周期与文件大小双重约束。3.6 root 日志级别与 Appender 挂载root levelinfo appender-ref refCONSOLE/ appender-ref refFILE_INFO/ appender-ref refFILE_ERROR/ /rootroot是日志树的最顶层 loggerlevelinfo意味着全局只有 INFO 及以上级别的日志会被处理这也解释了启动类中 TRACE、DEBUG 两条日志不会输出的原因三个 Appender 依次挂载所有日志先经 CONSOLE 精确过滤、再进 FILE_INFO拒 ERROR、最后进 FILE_ERROR收 ERROR 及以上从而形成控制台 普通文件 错误文件三层输出体系。3.7 输出格式说明INFO 文件与控制台使用 Spring Boot 默认 pattern由defaults.xml提供ERROR 文件使用自定义FILE_ERROR_PATTERN。原文档示例中的自定义 pattern 为%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n各转换符含义转换符含义%date日志产生时间默认格式yyyy-MM-dd HH:mm:ss.SSS%thread输出日志的线程名%-5level日志级别左对齐占 5 位如INFO、ERROR%logger{50}logger 名称最长截断为 50 个字符%file日志输出所在的源文件名%line日志输出所在的源码行号%msg日志消息内容%n换行符配置文件中通过${...}引用 Spring Boot 预置模板CONSOLE_LOG_PATTERN、FILE_LOG_PATTERN或自定义属性FILE_ERROR_PATTERN既保持了默认观感又能灵活追加%file:%line这类定位信息。四、application.yml与日志无关的基础配置demo-logback/src/main/resources/application.yml 中只配置了应用端口与上下文路径与日志功能无直接关系server: port: 8080 servlet: context-path: /demo说明该模块启动后Web 服务监听 8080 端口、访问前缀为/demo。日志输出位置由logback-spring.xml中的FileNamePattern决定即运行目录下的logs/demo-logback/文件夹与server配置相互独立。五、运行与验证5.1 启动应用在仓库根目录或 demo-logback 模块目录下执行 Maven 命令即可启动# 在模块目录下启动 mvn spring-boot:run # 或先打包再运行 mvn clean package -DskipTests java -jar target/demo-logback.jar启动成功后控制台会看到 CONSOLE Appender 输出的 INFO 日志target外的运行目录下会生成logs/demo-logback/目录内含logs/demo-logback/ ├── info.created_on_2026-09-18.part_0.log # 普通日志按天 2MB 拆分 └── error.created_on_2026-09-18.part_0.log # 错误日志含异常堆栈由于maxFileSize设为 2MB日志量较大时同一日期会出现.part_0、.part_1……依次递增的多个分片超过maxHistory90天的旧日志会被自动清理。5.2 上下文加载测试模块自带的测试类 SpringBootDemoLogbackApplicationTests.java 通过SpringBootTest加载完整应用上下文RunWith(SpringRunner.class) SpringBootTest public class SpringBootDemoLogbackApplicationTests { Test public void contextLoads() { } }该测试用于验证配置与 Bean 装配的正确性可执行mvn test运行。测试通过即代表日志配置logback-spring.xml被正确加载、应用上下文可正常启动。5.3 观察要点启动后可以直观验证以下几点控制台输出 INFO 格式日志且因LevelFilter精确匹配只显示 INFO 级别info.*.log中不会出现 ERROR 日志已被onMatchDENY拦截error.*.log中完整保留 ERROR 日志及ArithmeticException的完整堆栈TRACE、DEBUG 日志因 root 级别为info而不产生输出若想观察它们可将root levelinfo临时改为debug或trace再启动。六、延伸从 demo-logback 到项目级日志体系在 spring-boot-demo 聚合工程中日志能力不止于此。项目根 README.md 中列出集成的日志相关模块包括logback日志与aopLog通过 AOP 记录 Web 请求日志位于 demo-log-aop。这意味着在本项目里Logback 负责日志怎么写而 AOP 日志负责记录哪些内容二者配合可构建完整的请求日志链路。对于生产实践基于本模块的配置可以直接扩展的方向包括使用springProfile namedev|prod按环境切换输出级别与文件路径这是选用logback-spring.xml命名的主要收益将totalSizeCap从注释状态启用为日志目录设置总容量上限按业务模块拆分 logger为不同包路径配置独立 Appender 与级别接入日志采集组件如 Graylog参见项目中的 demo-graylog将文件日志进一步汇聚到集中日志平台。小结本模块演示了 Spring Boot Logback 的一套完整、可直接落地的日志方案通过Slf4j优雅地获取 logger通过logback-spring.xml实现控制台与文件双输出用LevelFilter与ThresholdFilter完成 INFO/ERROR 日志的分离用TimeBasedRollingPolicy叠加SizeAndTimeBasedFNATP实现按天 按大小的双重滚动归档并以maxHistory控制历史保留天数。掌握这套配置即可在自己的 Spring Boot 项目中快速搭建结构清晰、易于排查问题的日志体系。【免费下载链接】spring-boot-demo一个用来深入学习并实战 Spring Boot 的项目。项目地址: https://gitcode.com/gh_mirrors/sp/spring-boot-demo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表