# log **Repository Path**: sgven/log ## Basic Information - **Project Name**: log - **Description**: 日志库学习 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-10-12 - **Last Updated**: 2026-02-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 日志类库介绍 Log4j、Log4j2、Logback、SLF4J 是 Java 生态中最主流的日志相关类库, 它们之间的关系有点复杂,因为有的是“日志实现”,有的是“日志门面(抽象层)”。 ## 一、核心概念区分 ✅ 日志实现(Logging Implementation) - 负责真正写日志到控制台、文件、数据库等。 - 包括: - Log4j(1.x) - Log4j2 - Logback - java.util.logging(JUL,JDK 自带) ✅ 日志门面(Logging Facade / API) - 提供统一的调用接口,不负责实际写日志。 - 应用代码只依赖门面,底层实现可以随时替换。 - 主流门面: - SLF4J(Simple Logging Facade for Java)✅ 最推荐 - Commons Logging(JCL,较老,Spring 早期使用) >📌 类比:SLF4J 就像 USB-C 接口标准,Logback/Log4j2 就像不同品牌的充电线——你换线不影响手机(应用代码)。 ## 二、各框架简介与对比 | 名称 | 类型 | 特点 | 状态 | 性能 | 备注 | |-----------|--------|-------------------------------------------|--------------|------------|----------------------------------------------------------------------| | Log4j 1.x | 实现 | 老牌经典,Apache 项目 | ❌ 已停止维护(2015年) | 中等 | 存在严重安全漏洞(如 Log4Shell 是 Log4j2 的,但 1.x 也有其他问题) | | Log4j2 | 实现 | Log4j 升级版,异步日志强,插件化 | ✅ 活跃维护 | ⭐⭐⭐⭐⭐(最高) | 基于 Disruptor 高性能队列,支持异步日志,性能远超 Logback | | Logback | 实现 | Log4j 作者新作,天然支持 SLF4J | ✅ 活跃 | ⭐⭐⭐⭐ | Spring Boot 默认日志实现 | | SLF4J | 门面 | 统一日志 API,解耦应用与实现 | ✅ 活跃 | 无(只是接口) | 推荐所有项目使用它写日志 | ## 三、为什么需要 SLF4J? 想象一下: - 你的项目用 Log4j 写日志; - 你引入的第三方库 A 用 java.util.logging; - 第三方库 B 用 Logback; 结果:日志混乱、配置冲突、难以统一管理。 👉 SLF4J 的作用: - 你的代码只写:Logger logger = LoggerFactory.getLogger(MyClass.class); - 底层用 Logback?Log4j2?JUL?由你决定,代码不用改! - 通过引入不同的“绑定包”(binding)切换实现: - logback-classic.jar → 使用 Logback - log4j-slf4j-impl.jar → 使用 Log4j2 - slf4j-jdk14.jar → 使用 JUL ## 四、如何选择?推荐组合 | 场景 | 推荐组合 | 说明 | |------------------------------|-----------------|----------------------------------------| | 通用项目(尤其 Spring Boot) | SLF4J + Logback | Spring Boot 默认,开箱即用,稳定成熟 | | 高性能场景(高吞吐、低延迟) | SLF4J + Log4j2 | 异步日志性能极强,适合金融、交易系统 | | 避免使用 | Log4j 1.x | 已废弃,有安全隐患 | >💡 注意:不要直接使用 Log4j2 或 Logback 的原生 API,而应通过 SLF4J 调用! // ✅ 正确做法:使用 SLF4J import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MyService { private static final Logger log = LoggerFactory.getLogger(MyService.class); public void doSomething() { log.info("Processing user: {}", userId); // 参数化,避免字符串拼接 } } ## 五、关键优势对比 | 特性 | SLF4J + Logback | SLF4J + Log4j2 | |------------------|--------------------------|----------------------------------| | 默认集成 | Spring Boot 原生支持 | 需排除 Logback,引入 Log4j2 | | 异步日志 | 支持(AsyncAppender) | ⭐ 更强大(基于 Disruptor) | | 配置文件 | logback-spring.xml | log4j2-spring.xml | | 性能 | 良好 | ⭐ 极优(尤其高并发) | | 社区活跃度 | 高 | 高(Apache 顶级项目) | ## 六、总结一句话 >用 SLF4J 写日志,用 Logback 或 Log4j2 做实现 —— 前者保证代码解耦,后者按需选性能或生态。 如果你用 Spring Boot: - 默认就是 SLF4J + Logback,够用且省心; - 若追求极致性能,可切换到 SLF4J + Log4j2(需排除 spring-boot-starter-logging,引入 spring-boot-starter-log4j2)。