System.out.print
大概十年前,主要是C/S模式(客户端+服务端模式),整个服务端项目都做在一个工程里,大家验证基本上用的前端就是alert,后台就是System.out.print,Linux上shell脚本里采用echo的方式输出日志。
需求决定设计,写法轻巧需求简单这个方式基本就够用。
JUL(java.util.logging)
后续服务越来越大,类也越来越多,这时候日志很难分类和管理,于是java自己的日志框架应运而生。
站在现在来看他的缺点有:
- 性能较差
- 对于日志的级别分类也不是很清晰。
OFF SEVERE WARNING INFO CONFIG FINE FINER FINEST ALL
- 其API并不完善,仅支持硬编码
对开发者不是很友好,举个例子
logger.log(Level.INFO, "Logging {0} and {1}", new Object[]{i, someString});
写法也比较复杂,所以大家用的很少。
Log4j(Log for Java)
有人注意到JUL的一些缺陷,做出了独立的日志框架Log for Java。这就是Log4j。
首先log4j的写法比较优雅,以至于后续的日志框架也是仿着log4j的样式。
logger.info("Logging {} ", someString);
Log4j是Apache的一个开源项目。
log4j在设计时考虑了三个目标:可靠性,速度和灵活性。这些要求之间存在紧密的平衡。我们相信log4j能够达到最佳平衡。
log4j包含三个主要的组件:Logger、appender、Layout。XYZ轴确定指定打印的位置
他的一个显着特征是分层记录器的概念。使用记录器可以有选择地控制以任意粒度输出哪些日志语句,也可以控制每一条日志的输出格式,通过定义每一条日志信息的级别,能够更加细致的控制日志的生成过程。可控制日志信息输送的目的地是控制台、文件、数据jar等。
log4j使用6个级别,即TRACE,DEBUG,INFO,WARN,ERROR和FATAL。
Log4j支持两种格式的配置文件:properties和xml。
此外:
log4j不可靠。它是一种尽力而为的,故障了就停止记录系统。
log4j是线程安全的,内部加了同步锁synchronized。
JCL(Commons-Logging)
Jakarta是印度尼西亚的首都,而是Jakarta Commons。而JCL就是Jakarta Commons-Logging的缩写。
JakartaCommons是Jakarta的一个子项目,目的是创建和维护独立与其他框架和产品的程序包。
JCL的初衷是:
它就提供了一套API门面来掩盖真正的Logger实现。这就是设计模式里常用的门面模式,可以进行不同Logger实现的切换。
开发工程中记录信息非常必要的。但是,有许多日志记录实现,各种jar包有各种日志的使用,并且jar不能在jar所属的整个应用程序上强制使用特定的日志实现。
(java自身的一些包都用自己的JUL,而Log4j又那么好用。怎么让他们愉快的相处呢?)
commons-logging包是不同日志记录实现之间的桥接。使用commons-logging API的jar可以在运行时与任何日志记录实现一起使用。Commons-logging支持许多流行的日志记录实现,为其他人编写适配器是一项相当简单的任务。
应用程序(而不是jar)也可以选择使用commons-logging。虽然日志记录实现独立性对于应用程序而言并不像jar那样重要,但使用commons-logging确实允许应用程序在不重新编译代码的情况下更改为不同的日志记录实现。
它的缺点是算法复杂,并且出了异常很难修复。
请注意,commons-logging不会尝试初始化或终止在运行时使用的基础日志记录实现; 这是应用程序的责任。然而,许多流行的日志记录实现会自动初始化; 在这种情况下,应用程序可能能够避免包含特定于所使用的日志记录实现的任何代码。
SLF4J
Simple Logging Facade for Java,中文叫:简单日志门面。他的作者也是Log4j的作者。
fast-fail: 由于JVM加载类的方式,框架绑定将在很早的时候自动验证。
如果SLF4J在类路径上找不到绑定,它将发出单个警告消息,默认为无操作实现。
SLF4J是编译时绑定到具体的日志框架,性能优于采用运行时搜寻的方式的commons-logging。
SLF4J支持更多流行的日志框架,即log4j,java.util.logging,Simple logging和NOP。logback项目支持SLF4J本身。
Logback
Logback对log4j进行了大量改进。
logback在概念上与log4j非常相似, 他的作者也是Log4j的作者。
官方文档中这样描述的:如果您已熟悉log4j,您将很快感到宾至如归,如果你喜欢log4j,你可能会喜欢logback。
Logback有三个模块
1.logback-core:日志处理核心组件
2.logback-classic:完整的实现了SLF4j API,用于切换日志实现。
3.logback-access:与Servlet容器集成提供通过http来访问日志的功能。
优点如下:
- 速度更快,logback比log4j大约快10倍、
- 性能好,消耗更少的内存,
- 迁移成本也很低,提供convert工具类
- 自动压缩日志,天生支持把log文件自动打成zip文件
- 支持多样化配置,properties xml groovy
- 不需要重启就可以恢复I/O异常,一旦文件服务器恢复,相关的logback appender将从之前的错误状态透明地快速恢复。
- 自动删除旧的日志存档,减少运维成本.
Log4j2
他的作者也是Log4j的作者。。
记录日志确实有其缺点。它可以减慢应用程序的速度。如果过于冗长,则会导致滚动失效。
log4j2的优点如下:
1.Log4j 1.x和Logback都会在重新配置时丢失事件。Log4j2不会。
原因在Logback中,Appender中的异常永远不会对应用程序可见。在Log4j中,可以将Appender配置为允许异常渗透到应用程序。
2.log4j2的性能有极大的提升。
原因它采用了disruptor作为异步记录器,多线程场景中,异步记录器的吞吐量比Log4j 1.x和Logback高10倍,延迟低几个数量级。
3.Log4j2 对于独立应用程序是无垃圾的。
原因,大量使用buffer,对于稳定状态日志记录期间的Web应用程序来说是低垃圾。这减少了垃圾收集器的压力,并且可以提供更好的响应时间性能。
4.java8之后支持lambda表达式。
好处:可以选择使用lambda表达式来延迟构造日志消息。不需要显式级别检查,从而产生更清晰的代码。
5.支持自定义日志级别。
可以在代码或配置中定义自定义日志级别。