1.简介
在做项目的时候免不了要输出日志,最简单的使用System.out打印实现,但这又不太方便而且输出到控制台,不易保存,所以就有了日志框架,简单地说就是取代了我们在平时用System.out输出我们需要的信息的方法。使用日志框架可以帮我们使用门面模式调用接口。简单的实现输出日志信息(通常是我们所需要的信息)到文件中,而且还可以分等级,避免我们用程序控制。
2.日志框架的介绍
日志框架分为具体实现的日志框架和日志接口框架,让我们一起分别来看看它们和它们之间的区别。
1.日志接口框架
在这里我们先提一下门面模式:
门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
就如同医院的接待员一样,门面模式的门面类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与门面对象打交道,而不需要与子系统内部的很多对象打交道。
然后介绍日志接口框架:
-
目前流行的就是apache的commons-logging(JCL)和slf4j,他两的作用就是提供统一的接口,而具体的日志实现交给底层绑定的具体的日志实现框架。这样一来,我们的业务系统中可以灵活的更换不同的日志实现,并且可以不需要去改动代码。对于开发者而言,每种日志都有不同的写法。如果我们以实际的日志框架来进行编写,代码就限制死了,之后就很难再更换日志系统,很难做到无缝切换。
-
Commons Logging 也就是JCL,提供的是一个日志接口(Interface),自身提供一个简单的日志文件系统,但一般和其他日志系统组合使用。如:Commons-Logging + Log4j组合使用。它会通过动态查找机制,在程序运行时自动找出真正使用的日志库。
-
Slf4j 即Simple Logging Facade for Java,和Commons-Logging类似,也是对不同日志框架提供的一个门面封装,可以在部署的时候可以通过桥接包接入其他日志方案来组合使用。它支持多个参数并通过"{ }"占位符来进行替换。
-
在这里提到的日志接口框架就是使用了门面设计模式,它其实是对具体的日志框架的一个再封装,如果以后因为业务原因需要更换日志框架,就可以直接更改底层的具体日志框架就可以了
2.具体日志框架
-
log4j
- Log4j 即Log for Java ,经典的一种日志解决方案。内部把日志系统抽象封装成Logger 、appender 、pattern等实现。我们可以通过配置文件轻松的实现日志系统的管理和多样化配置。
- 系统的三大板块:日志写入器Logger、日志输出终端Appender、日志布局模式Layout。其中Appender常用的有ConsoleAppender(输出到控制台)、FileAppender(输出文件)和RollingFileAppender(输出滚动文件)三种。
- 在classpath下编写配置文件log4j.properties,配置相关日志属性和格式。
-
Log4j2
Log4j2 是在Log4j 1.x版本基础上的一个升级版本。性能得到提升的同时,还能够自动装载配置文件,支持参数变量的占位符功能,可以专门指定事件进行过滤,并且支持插件式架构
-
Logback
Logback是由log4j创始人涉及的又一个开源的日志组件,logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-classic完整实现Slf4j API,使我们可以很方便地更换成其它日志系统,如:log4j或JDK。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。
-
JDK logger
简称jul(java-util-logging)
JDK1.4引入了java.util.logging包,包中主要的类包括:Logger、LogManager、Handler、Formatter。
3.对应的JAR包
-
java-util-logging:jdk自带的日志实现,简称jul(java-util-logging)
-
log4j:log4j
-
log4j2: log4j-api-2.11.1.jar(定义的api),log4j-core-2.11.1.jar(api的实现)
(版本号不一定) -
logback:logback-core(logback的核心包)、logback-classic(logback实现了slf4j的API)
-
commons-logging(JCL):
commons-logging(commons-logging的原生全部内容)
log4j-jcl(commons-logging到log4j2的桥梁)
jcl-over-slf4j(commons-logging到slf4j桥梁) -
slf4j:这个框架比较复杂,在整个日志组件中起到了一个中转站的作用
- 使用slf4j的api编程,底层用其他具体的实现:
slf4j-jdk14:slf4j到jdk-logging的桥梁
slf4j-log4j12:slf4j到log4j1的桥梁
log4j-slf4j-impl:slf4j到log4j2的桥梁
logback-classic:slf4j到logback的桥梁
slf4j-jcl:slf4j到commons-logging的桥梁 - 如使用log4j的api编程,但最终输出通过logback来实现,这样的话就必须先将log4j转交给slf4j,再通过slf4j转交给logback
jul-to-slf4j:jdk-logging到slf4j的桥梁
log4j-over-slf4j:log4j1到slf4j的桥梁
jcl-over-slf4j:commons-logging到slf4j的桥梁