整合 Logback 日志框架概述日志是排查问题的眼睛。接口报错了、数据不对了、性能慢了第一反应就是去看日志。Spring Boot 默认集成了 Logback你要做的不是引入而是配好。需要引入依赖吗不需要。spring-boot-starter-web里面已经自带了spring-boot-starter-logging而spring-boot-starter-logging底层就是 Logback。只要你用了 Spring Boot WebLogback 就已经在 classpath 里了。所以直接进入正题写配置文件。配置文件放哪Spring Boot 会自动在 classpath 下查找这几个文件文件名优先级logback-spring.xml✅ 推荐可以用 Spring 的springProfile标签按环境切换logback.xml能用但不支持springProfile比 Spring 更早加载命名加-spring后缀的原因是logback.xml先于 Spring 容器加载那时候还不知道激活的是哪个 profile所以springProfile标签不生效。logback-spring.xml则交给 Spring 来控制加载时机profile 功能就能用了。所以我们统一放在src/main/resources/logback-spring.xml。从零开始搭第一步定义变量先定义几个变量后面反复用到改一处全生效configuration!-- 引用 Spring Boot 自带的默认变量CONSOLE_LOG_PATTERN 等 --includeresourceorg/springframework/boot/logging/logback/defaults.xml/!-- 应用名称区分不同服务的日志 --propertyscopecontextnameappNamevalueauth/!-- 日志文件路径和名称 --propertynameLOG_FILEvalue./logs/${appName}.%d{yyyy-MM-dd}/!-- 每行日志的输出格式 --propertynameLOG_PATTERNvalue%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n//configurationLOG_PATTERN里每个占位符的含义占位符含义输出示例%d{yyyy-MM-dd HH:mm:ss.SSS}时间2026-07-06 14:30:00.123[%thread]线程名[http-nio-8080-exec-1]%-5level日志级别左对齐占 5 位INFO%logger{50}输出日志的类名最多 50 个字符c.l.i.a.controller.TestController%msg%n日志正文 换行—第二步配置文件输出RollingFileAppender日志必须落地到文件不然服务一重启控制台的就没了。appendernameFILEclassch.qos.logback.core.rolling.RollingFileAppenderrollingPolicyclassch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy!-- 日志文件命名auth.2026-07-06-0.log、auth.2026-07-06-1.log ... --fileNamePattern${LOG_FILE}-%i.log/fileNamePattern!-- 保留 30 天 --maxHistory30/maxHistory!-- 单个文件超过 10MB 就滚动到下一个 --maxFileSize10MB/maxFileSize!-- 总大小不限制 --totalSizeCap0/totalSizeCap!-- 重启不清历史日志 --cleanHistoryOnStartfalse/cleanHistoryOnStart/rollingPolicyencoderpattern${LOG_PATTERN}/patterncharsetUTF-8/charset/encoder/appenderSizeAndTimeBasedRollingPolicy是一个复合滚动策略同时按时间和大小来切分文件。普通策略只能二选一这个可以兼顾每天生成新文件auth.2026-07-06-0.log单文件超过 10MB 也会切auth.2026-07-06-1.log、auth.2026-07-06-2.log……超过 30 天的旧文件自动删除属性作用fileNamePattern日志文件的命名模板maxFileSize单个文件超过多大就滚动切分maxHistory最多保留多少天totalSizeCap总大小上限0表示不限制cleanHistoryOnStart启动时是否清空历史生产环境务必设为false第三步异步写入AsyncAppender上一步的FILEappender 是同步写的每次log.info()都直接写磁盘I/O 阻塞当前线程。高并发下日志写入会成为性能瓶颈。所以我们需要异步日志先扔到一个内存队列里由另一个线程负责批量刷盘。appendernameASYNC_FILEclassch.qos.logback.classic.AsyncAppender!-- 队列满时是否丢弃日志。0 表示永不丢弃 --discardingThreshold0/discardingThreshold!-- 队列容量默认 256 --queueSize256/queueSize!-- 套在哪个真实 appender 外面 --appender-refrefFILE//appender配置项含义queueSize队列大小。日志量大的服务可以调到 512 或 1024discardingThreshold队列满到多少比例开始丢弃。默认20即队列满 80% 时丢弃 TRACE/DEBUG/INFO 级别的日志。设为0表示永不丢弃宁可堵着也不丢discardingThreshold 0为什么重要默认值是 20。意味着队列满了 80%新来的INFO日志直接扔掉。排查线上问题的时候你翻半天日志发现关键那条刚好被丢了抓瞎。设成0之后如果队列满了会阻塞一小会儿等队列腾出空间但不会丢日志。如果你对性能有极致要求、允许偶尔丢日志可以把discardingThreshold调成默认值并且打开neverBlock。第四步控制台输出CONSOLE appender不会有人把所有的日志都写在文件里控制台也要一份。毕竟 DevOps 看的是控制台。不过 Spring Boot 已经自带了console-appender.xml不需要手写直接引用就行includeresourceorg/springframework/boot/logging/logback/console-appender.xml/第五步按环境组装开发环境我希望控制台 文件都有生产环境只保留文件别在线上打控制台日志浪费 I/O。用springProfile按环境分别配置!-- 开发环境控制台 文件 --springProfilenamedevincluderesourceorg/springframework/boot/logging/logback/console-appender.xml/rootlevelINFOappender-refrefCONSOLE/appender-refrefASYNC_FILE//root/springProfile!-- 生产环境只看文件不打控制台 --springProfilenameprodrootlevelINFOappender-refrefASYNC_FILE//root/springProfileroot levelINFO的含义默认日志级别为INFODEBUG和TRACE的日志不打印除非单独给某个包开了 DEBUG。完整配置把上面的步骤拼起来configurationincluderesourceorg/springframework/boot/logging/logback/defaults.xml/!-- 变量 --propertyscopecontextnameappNamevalueauth/propertynameLOG_FILEvalue./logs/${appName}.%d{yyyy-MM-dd}/propertynameLOG_PATTERNvalue%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n/!-- 文件输出同步 --appendernameFILEclassch.qos.logback.core.rolling.RollingFileAppenderrollingPolicyclassch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicyfileNamePattern${LOG_FILE}-%i.log/fileNamePatternmaxHistory30/maxHistorymaxFileSize10MB/maxFileSizetotalSizeCap0/totalSizeCapcleanHistoryOnStartfalse/cleanHistoryOnStart/rollingPolicyencoderpattern${LOG_PATTERN}/patterncharsetUTF-8/charset/encoder/appender!-- 异步包装 --appendernameASYNC_FILEclassch.qos.logback.classic.AsyncAppenderdiscardingThreshold0/discardingThresholdqueueSize256/queueSizeappender-refrefFILE//appender!-- 开发环境 --springProfilenamedevincluderesourceorg/springframework/boot/logging/logback/console-appender.xml/rootlevelINFOappender-refrefCONSOLE/appender-refrefASYNC_FILE//root/springProfile!-- 生产环境 --springProfilenameprodrootlevelINFOappender-refrefASYNC_FILE//root/springProfile/configuration常见踩坑No appenders present如果你启动后看到这个警告WARN - No appenders present in context [default] for logger [xxx]意思是 Logback 找不到任何root配置——没有一个 appender 生效日志不知道该往哪儿输出。回头检查你的springProfile你的application.properties里是否配置了spring.profiles.active如果没有激活任何 profile比如没设dev那么所有的springProfile都不会生效root也就没了。修法在application.properties里加上spring.profiles.activedev或者写一个default 配置在所有springProfile之外补一段root作为兜底!-- 兜底当没有任何 profile 激活时默认输出到控制台 --rootlevelINFOappender-refrefCONSOLE//root
整合Logback日志框架
发布时间:2026/7/7 4:04:35
整合 Logback 日志框架概述日志是排查问题的眼睛。接口报错了、数据不对了、性能慢了第一反应就是去看日志。Spring Boot 默认集成了 Logback你要做的不是引入而是配好。需要引入依赖吗不需要。spring-boot-starter-web里面已经自带了spring-boot-starter-logging而spring-boot-starter-logging底层就是 Logback。只要你用了 Spring Boot WebLogback 就已经在 classpath 里了。所以直接进入正题写配置文件。配置文件放哪Spring Boot 会自动在 classpath 下查找这几个文件文件名优先级logback-spring.xml✅ 推荐可以用 Spring 的springProfile标签按环境切换logback.xml能用但不支持springProfile比 Spring 更早加载命名加-spring后缀的原因是logback.xml先于 Spring 容器加载那时候还不知道激活的是哪个 profile所以springProfile标签不生效。logback-spring.xml则交给 Spring 来控制加载时机profile 功能就能用了。所以我们统一放在src/main/resources/logback-spring.xml。从零开始搭第一步定义变量先定义几个变量后面反复用到改一处全生效configuration!-- 引用 Spring Boot 自带的默认变量CONSOLE_LOG_PATTERN 等 --includeresourceorg/springframework/boot/logging/logback/defaults.xml/!-- 应用名称区分不同服务的日志 --propertyscopecontextnameappNamevalueauth/!-- 日志文件路径和名称 --propertynameLOG_FILEvalue./logs/${appName}.%d{yyyy-MM-dd}/!-- 每行日志的输出格式 --propertynameLOG_PATTERNvalue%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n//configurationLOG_PATTERN里每个占位符的含义占位符含义输出示例%d{yyyy-MM-dd HH:mm:ss.SSS}时间2026-07-06 14:30:00.123[%thread]线程名[http-nio-8080-exec-1]%-5level日志级别左对齐占 5 位INFO%logger{50}输出日志的类名最多 50 个字符c.l.i.a.controller.TestController%msg%n日志正文 换行—第二步配置文件输出RollingFileAppender日志必须落地到文件不然服务一重启控制台的就没了。appendernameFILEclassch.qos.logback.core.rolling.RollingFileAppenderrollingPolicyclassch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy!-- 日志文件命名auth.2026-07-06-0.log、auth.2026-07-06-1.log ... --fileNamePattern${LOG_FILE}-%i.log/fileNamePattern!-- 保留 30 天 --maxHistory30/maxHistory!-- 单个文件超过 10MB 就滚动到下一个 --maxFileSize10MB/maxFileSize!-- 总大小不限制 --totalSizeCap0/totalSizeCap!-- 重启不清历史日志 --cleanHistoryOnStartfalse/cleanHistoryOnStart/rollingPolicyencoderpattern${LOG_PATTERN}/patterncharsetUTF-8/charset/encoder/appenderSizeAndTimeBasedRollingPolicy是一个复合滚动策略同时按时间和大小来切分文件。普通策略只能二选一这个可以兼顾每天生成新文件auth.2026-07-06-0.log单文件超过 10MB 也会切auth.2026-07-06-1.log、auth.2026-07-06-2.log……超过 30 天的旧文件自动删除属性作用fileNamePattern日志文件的命名模板maxFileSize单个文件超过多大就滚动切分maxHistory最多保留多少天totalSizeCap总大小上限0表示不限制cleanHistoryOnStart启动时是否清空历史生产环境务必设为false第三步异步写入AsyncAppender上一步的FILEappender 是同步写的每次log.info()都直接写磁盘I/O 阻塞当前线程。高并发下日志写入会成为性能瓶颈。所以我们需要异步日志先扔到一个内存队列里由另一个线程负责批量刷盘。appendernameASYNC_FILEclassch.qos.logback.classic.AsyncAppender!-- 队列满时是否丢弃日志。0 表示永不丢弃 --discardingThreshold0/discardingThreshold!-- 队列容量默认 256 --queueSize256/queueSize!-- 套在哪个真实 appender 外面 --appender-refrefFILE//appender配置项含义queueSize队列大小。日志量大的服务可以调到 512 或 1024discardingThreshold队列满到多少比例开始丢弃。默认20即队列满 80% 时丢弃 TRACE/DEBUG/INFO 级别的日志。设为0表示永不丢弃宁可堵着也不丢discardingThreshold 0为什么重要默认值是 20。意味着队列满了 80%新来的INFO日志直接扔掉。排查线上问题的时候你翻半天日志发现关键那条刚好被丢了抓瞎。设成0之后如果队列满了会阻塞一小会儿等队列腾出空间但不会丢日志。如果你对性能有极致要求、允许偶尔丢日志可以把discardingThreshold调成默认值并且打开neverBlock。第四步控制台输出CONSOLE appender不会有人把所有的日志都写在文件里控制台也要一份。毕竟 DevOps 看的是控制台。不过 Spring Boot 已经自带了console-appender.xml不需要手写直接引用就行includeresourceorg/springframework/boot/logging/logback/console-appender.xml/第五步按环境组装开发环境我希望控制台 文件都有生产环境只保留文件别在线上打控制台日志浪费 I/O。用springProfile按环境分别配置!-- 开发环境控制台 文件 --springProfilenamedevincluderesourceorg/springframework/boot/logging/logback/console-appender.xml/rootlevelINFOappender-refrefCONSOLE/appender-refrefASYNC_FILE//root/springProfile!-- 生产环境只看文件不打控制台 --springProfilenameprodrootlevelINFOappender-refrefASYNC_FILE//root/springProfileroot levelINFO的含义默认日志级别为INFODEBUG和TRACE的日志不打印除非单独给某个包开了 DEBUG。完整配置把上面的步骤拼起来configurationincluderesourceorg/springframework/boot/logging/logback/defaults.xml/!-- 变量 --propertyscopecontextnameappNamevalueauth/propertynameLOG_FILEvalue./logs/${appName}.%d{yyyy-MM-dd}/propertynameLOG_PATTERNvalue%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n/!-- 文件输出同步 --appendernameFILEclassch.qos.logback.core.rolling.RollingFileAppenderrollingPolicyclassch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicyfileNamePattern${LOG_FILE}-%i.log/fileNamePatternmaxHistory30/maxHistorymaxFileSize10MB/maxFileSizetotalSizeCap0/totalSizeCapcleanHistoryOnStartfalse/cleanHistoryOnStart/rollingPolicyencoderpattern${LOG_PATTERN}/patterncharsetUTF-8/charset/encoder/appender!-- 异步包装 --appendernameASYNC_FILEclassch.qos.logback.classic.AsyncAppenderdiscardingThreshold0/discardingThresholdqueueSize256/queueSizeappender-refrefFILE//appender!-- 开发环境 --springProfilenamedevincluderesourceorg/springframework/boot/logging/logback/console-appender.xml/rootlevelINFOappender-refrefCONSOLE/appender-refrefASYNC_FILE//root/springProfile!-- 生产环境 --springProfilenameprodrootlevelINFOappender-refrefASYNC_FILE//root/springProfile/configuration常见踩坑No appenders present如果你启动后看到这个警告WARN - No appenders present in context [default] for logger [xxx]意思是 Logback 找不到任何root配置——没有一个 appender 生效日志不知道该往哪儿输出。回头检查你的springProfile你的application.properties里是否配置了spring.profiles.active如果没有激活任何 profile比如没设dev那么所有的springProfile都不会生效root也就没了。修法在application.properties里加上spring.profiles.activedev或者写一个default 配置在所有springProfile之外补一段root作为兜底!-- 兜底当没有任何 profile 激活时默认输出到控制台 --rootlevelINFOappender-refrefCONSOLE//root