日志框架发展史
早期阶段
Java 1.0 时代,开发者使用
System.out.println打印日志。缺点:
无法控制日志级别(如 DEBUG、INFO)。
性能差(同步 IO)。
无法灵活输出到文件或网络。
Log4j 时代
俄罗斯开发者Ceki Gülcü 开发了Log4j,后捐赠给 Apache 软件基金会。
特点:
高性能异步日志。
支持多种输出方式(文件、数据库、邮件等)。
灵活的配置文件(
log4j.properties或log4j.xml)。
JUL(java.util.logging)
稍晚于Log4j,Sun在 JDK 1.4 中引入了 JUL(Java Util Logging),作为官方日志框架。
特点:
支持日志级别(
SEVERE、WARNING、INFO等)。可配置 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。