网站Logo GESONG

JAVA日志体系

gesong
3
2025-08-26

日志框架发展史

早期阶段

  • Java 1.0 时代,开发者使用 System.out.println 打印日志。

  • 缺点

    • 无法控制日志级别(如 DEBUG、INFO)。

    • 性能差(同步 IO)。

    • 无法灵活输出到文件或网络。

Log4j 时代

俄罗斯开发者Ceki Gülcü 开发了Log4j,后捐赠给 Apache 软件基金会。

  • 特点

    • 高性能异步日志。

    • 支持多种输出方式(文件、数据库、邮件等)。

    • 灵活的配置文件(log4j.propertieslog4j.xml)。

JUL(java.util.logging

稍晚于Log4j,Sun在 JDK 1.4 中引入了 JUL(Java Util Logging),作为官方日志框架。

  • 特点

    • 支持日志级别(SEVEREWARNINGINFO 等)。

    • 可配置 Handler(控制台、文件、Socket 等)。

  • 问题

    • 性能较差,扩展性不足。

    • 配置复杂,社区接受度低。

JCL(Jakarta Commons Logging(后改名 Apache Commons Logging

  • Apache 推出的 日志门面,用于兼容不同日志实现(如 Log4j、JUL)。

  • 问题

    • 类加载机制复杂,容易引发冲突。

    • 性能较差,逐渐被 SLF4J 取代。

SLF4J 与 Logback 时代

SLF4j

  • 作者:Ceki Gülcü(Log4j 作者)开发,用于解决日志框架的耦合问题。

  • 定位日志门面(Facade),提供统一 API,底层可绑定 Logback、Log4j 等(通过特定的适配器,Logback不需要,原生支持)。

  • 优势

    • 无类加载问题(优于 JCL)。

    • 支持参数化日志(logger.info("User: {}", user)),避免字符串拼接开销。

  • 适配器和桥接器

    • 适配器:将 SLF4J 调用转发到具体日志实现

    • 桥接器:将其他日志框架的调用重定向到 SLF4J

Logback

  • 作者:Ceki Gülcü (Log4j 作者)开发,作为 Log4j 的继承者。

  • 特点

    • 原生支持 SLF4J,无需适配层(性能大幅优于log4j)。

    • 自动重载配置、更灵活的过滤策略。

    • 成为 Spring Boot 默认日志框架

Log4j 2.x

  • Apache 推出的 Log4j 重大升级,解决 Log4j 1.x 的架构问题。

  • 改进

    • 异步日志性能远超 Logback。

    • 插件化架构,支持自定义 Appender、Filter。

    • 兼容 SLF4J(通过 log4j-slf4j-impl)。

  • 现状

    • 在高并发场景下优于 Logback。

动物装饰