news 2026/9/11 3:19:29

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/9/8 7:50:18

探索整流器与逆变器的协同应用:从原理到实践

整流器逆变器。 前级采用PWM整流器&#xff0c;采用双闭环前馈解耦控制&#xff0c;实现并网单位功率因数&#xff0c;稳定直流电压。 后级采用两电平逆变器&#xff0c;通过双闭环前馈解耦控制&#xff0c;稳定输出电压。 整个仿真环境完全离散化&#xff0c;运行时间更快&…

作者头像 李华
网站建设 2026/9/2 13:49:41

基于有效磁链的无传感器控制模型探索

该模型基于有效磁链进行无传感器控制&#xff0c;为了改善磁链观测器的低速性能&#xff0c;提高低速下观测精度&#xff0c;使用电压电流混合模型&#xff0c;其运行原理为&#xff1a;使用电压模型获取定子磁链&#xff0c;经过有效磁链转化后得到转子磁链&#xff0c;通 过反…

作者头像 李华
网站建设 2026/9/2 13:50:23

永磁同步模型中的电流预测控制与广义预测控制(速度环)探索

永磁同步模型电流预测控制广义预测控制(速度环&#xff09; 速度环预测控制采用广义预测与扩展状态观测器结合&#xff0c;提高系统鲁棒性和稳态特性。 电流环采用预测控制双矢量改进算法。 含有对应学习文献 在永磁同步电机&#xff08;PMSM&#xff09;控制系统中&#xff0c…

作者头像 李华
网站建设 2026/9/2 15:06:01

从数据库到智能体:教育企业如何构建自己的“数字大脑”?

在近期一场顶级技术大会上&#xff0c;“智能体结构”成为焦点。会议指出&#xff0c;未来内容不是写出来的&#xff0c;而是从智能系统中“生长”出来的。这对于依赖内容与服务的教育行业而言&#xff0c;启示深远。创客匠人作为教育数字化领域的长期陪伴者&#xff0c;观察到…

作者头像 李华
网站建设 2026/9/8 7:50:30

MetaHuman 穿鞋 学习笔记

目录 隐藏衣服: 右侧 Details 搜索框输入:hidden 然后,勾选:Hidden In Game 给 MetaHuman 穿静态网格鞋子(Static Mesh Shoes),本质上就是: 把「静态鞋子」 → 变成「跟随角色骨骼的 Skeletal Mesh」,再绑定到脚骨。 我按 最实用路线 给你讲(适合你现在搞 MetaHum…

作者头像 李华