当前位置: 首页 > news >正文

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,线上稳得一批。祝排错愉快!

http://www.jsqmd.com/news/322290/

相关文章:

  • 推荐一个极为好用的数学物理的网站 - Rye
  • 如何利用YashanDB数据库提升企业数据决策效率
  • 威海市英语雅思培训机构推荐:2026权威测评出国雅思辅导机构口碑榜单
  • 旧物回收小程序前端功能设计:以用户为核心构建环保便捷通道
  • 数据库连接池原理:HikariCP为何性能卓越
  • 2026年展厅设计优质企业Top5推荐:数智技术赋能+全维度选择指南
  • 国标GB28181算法算力平台EasyGBS城市广场智慧监控与治理方案设计
  • 如何利用YashanDB数据库提升企业数据运营效率
  • 国内苹果MAC电脑安装Rust开发环境捷径路线
  • 济宁市英语雅思培训机构推荐,2026权威测评出国雅思辅导机构口碑榜单
  • Clawdbot MVP:从 0 → 1 的可落地设计方案
  • 还在用 Postman?试试超轻量开源接口管理工具 PostIn
  • 探索整流器与逆变器的协同应用:从原理到实践
  • 如何利用YashanDB数据库提升客户数据管理效率
  • 高压开关特性测试仪检定装置多少钱?价格解析与上海冠仪选型指南
  • 国标GB28181-2022平台EasyGBS构建智慧机场全域智能监控体系
  • 如何利用YashanDB数据库提升复杂查询的响应速度
  • 2026年机床防护罩行业报告:品牌影响力TOP5源头厂家推荐
  • React Hooks最佳实践:useEffect依赖数组的陷阱
  • 如何利用YashanDB数据库提升数据共享效率
  • 批处理界面:echo 输出的前景色和背景色
  • 如何利用YashanDB数据库提升开发效率
  • 如何利用YashanDB数据库提升企业数据安全防护能力
  • 互联网大厂高频面试题核心框架
  • 2026年市场上优质的抖音矩阵企业哪个好,信息流广告代运营/视频矩阵/抖音短视频矩阵、AI广告,抖音矩阵公司口碑推荐榜
  • 如何利用YashanDB数据库提升数据准确性
  • Kubernetes容器环境故障排查指南
  • RESTful API设计规范:资源命名与状态码使用
  • 2026年澳洲奶粉品牌行业发展趋势、方案与选择指南,臻护新苼为什么更好
  • TypeScript高级类型:条件类型与映射类型实战