news 2026/4/18 1:05:01

logback 速查上手

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
logback 速查上手

下面给出一份“logback 速查手册”,从“零配置能跑”到“线上调优”一条线捋清,复制即可用。

一、logback 是什么

  • 作者:log4j 创始人 Ceki Gülcü 的“亲儿子”,SLF4J 默认实现。

  • 特点:速度更快、内存占用更低、XML/Groovy 双配置、SiftingAppender(多租户/多文件自动分离)、自动热加载。

二、零依赖就能跑(Spring Boot 已内置)

<!-- 实际不用再引,spring-boot-starter-web 已传递 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency>

代码里:

private static final Logger log = LoggerFactory.getLogger(UserService.class); log.info("order {} paid", orderId);

三、核心三件套

Logger(写日志) → Appender(写到哪) → Encoder/Layout(怎么格式化)

四、最常用配置文件(src/main/resources/logback-spring.xml,SpringBoot 专用)

<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="30 seconds"> <!-- 30s热加载 --> <springProfile name="dev,test"> <!-- 开发/测试环境彩色控制台 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%cyan(%d{HH:mm:ss.SSS}) %highlight(%-5level) %magenta([%thread]) %yellow(%logger{36}:%line) - %msg%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <root level="INFO"> <appender-ref ref="CONSOLE"/> </root> </springProfile> <springProfile name="prod"> <!-- 生产只按大小/日期滚动文件 --> <property name="LOG_HOME" value="/var/log/app"/> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}/business.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/business.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxFileSize>200MB</maxFileSize> <maxHistory>30</maxHistory> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}:%line - %msg%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <!-- 异步提升性能,丢日志<0.01%可接受 --> <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="FILE"/> <queueSize>2048</queueSize> <discardingThreshold>0</discardingThreshold> <includeCallerData>false</includeCallerData> </appender> <root level="INFO"> <appender-ref ref="ASYNC"/> </root> </springProfile> <!-- 单独给 error 再写一份,方便告警 --> <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME:-./logs}/error.log</file> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME:-./logs}/error.%d{yyyy-MM-dd}.log.gz</fileNamePattern> <maxHistory>15</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36}:%line - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="ERROR"/> </root> </configuration>

要点

  • 文件名必须是 logback-spring.xml 才能用 <springProfile> 动态区分环境,否则启动报错。

  • scan="true" 修改配置后 30 秒自动生效,无需重启。

  • AsyncAppender 队列满时会丢弃 TRACE/DEBUG,INFO 以上不丢(discardingThreshold=0)。

五、多租户/多文件自动分离(SiftingAppender 实战)

<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"> <discriminator> <key>tenantId</key> <defaultValue>default</defaultValue> </discriminator> <sift> <appender class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/var/log/app/${tenantId}.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/var/log/app/${tenantId}.%d{yyyy-MM-dd}.log.gz</fileNamePattern> <maxHistory>15</maxHistory> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %level %logger{36} - %msg%n</pattern> </encoder> </appender> </sift> </appender>

代码里放 discriminator:

MDC.put("tenantId", TenantContext.get());

即可按租户自动拆文件,再也不用 if-else 新建 logger。

六、线上调优 checklist

  1. 关闭 debug 级别:<logger name="com.alibaba.nacos" level="WARN"/>

  2. 关闭 includeCallerData(AsyncAppender 里拿行号会慢 5~10 倍)。

  3. 使用 SizeAndTimeBasedRollingPolicy 而非 FixedWindowRollingPolicy,大并发下减少重命名竞争。

  4. 磁盘独立:日志盘与业务盘分离,避免 java.io.IOException: No space left on device 把应用拖死。

  5. 监控:

  • 文件句柄数 /proc/sys/fs/file-max

  • 日志写入延迟:appender.getQueueSize() / appender.getDiscardingCount()

  • 接入 Prometheus:通过 logback-metrics 暴露 logback_events_total{level="error"} 做告警。

七、常见坑

现象

原因

快速 fix

修改 logback.xml 不生效

文件名写成 logback.xml 却被 spring 提前加载

改名 logback-spring.xml

控制台彩色失效

Windows 老版本 ANSI 不支持

加 jansi 依赖或关闭彩色

启动报 “no applicable action for [springProfile]”

用了普通 logback.xml

换 logback-spring.xml

日志文件中文乱码

没有 <charset>UTF-8</charset>

全部 encoder 加 charset

一张图记忆 Logger → 级别开关 ↓ Appender → 写控制台?文件?ES? ↓ Encoder → 长啥样?JSON? pattern? ↓ RollingPolicy → 多大切割?保留几天?

把上面模板直接粘进项目,30 秒内就能拥有“彩色控制台 + 大小时间滚动 + 异步写盘 + ERROR 单独文件”的标配日志,再按环境切 profile,线上稳得一批。祝排错愉快!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 13:34:47

一番赏盲盒抽卡机小程序:解锁惊喜体验与社交乐趣的多元功能设计

在数字娱乐与潮流文化交融的当下&#xff0c;一番赏盲盒抽卡机小程序凭借其独特的玩法设计与社交属性&#xff0c;成为年轻人探索未知、分享乐趣的新选择。它以“惊喜感”为核心&#xff0c;通过丰富的功能模块与交互细节&#xff0c;构建了一个兼具娱乐性与社交性的沉浸式平台…

作者头像 李华
网站建设 2026/4/18 8:39:33

LangChain提示词

提示词模板Prompt当需要重复使用固定格式的提示词&#xff08;仅动态内容变化&#xff09;时&#xff0c;可通过 PromptTemplate 标准化提示词结构&#xff0c;避免重复编写模板内容&#xff0c;提升开发效率。适用于批量生成问题、标准化指令场景&#xff08;如批量生成产品描…

作者头像 李华
网站建设 2026/4/18 7:35:16

冥想第一千七百七十八天(1778)

1.周四&#xff0c;可能昨天游泳太累了&#xff0c;今天感觉身体无力&#xff0c;项目上也非常忙&#xff0c;跑团让领的米和面也是套路&#xff0c;要听课&#xff0c;我直接就回来了。 2.感谢父母&#xff0c;感谢朋友&#xff0c;感谢家人&#xff0c;感谢不断进步的自己。

作者头像 李华
网站建设 2026/4/18 4:52:37

LabVIEW 触摸键盘模块:可移植与源码转出之旅

LabVIEW编写的键盘模块&#xff0c;可移植&#xff0c;源码转出&#xff0c;Ni LabVIEW触摸键盘。 在LabVIEW的奇妙世界里&#xff0c;构建一个可移植的触摸键盘模块&#xff0c;不仅实用&#xff0c;还充满乐趣。今天就跟大家唠唠这个Ni LabVIEW触摸键盘的事儿。 一、LabVIE…

作者头像 李华