日志是平时开发时最长用到的开发工具,可以打印出我们必要的运行期数据或者提示到日志文件,供我们排错或者查找数据使用,也许我们平时只关注于日志的使用,以及打印数据的格式,比较少关注如何去搭建一套日志输出体系,由于最近做的一个项目中涉及到日志输出时的问题,所以这里就讲日志有关的知识和使用进行总结,一来供自己日后使用,再则和大家共同学习。
日志简介
首先我们要知道,就目前我们使用的日志系统分为两部分:日志门面和日志实现。所谓日志门面就是日志接口,之所以要定义日志门面就是为了解耦,不让具体的日志实现和我们业务进行耦合,这样我们可以根据自己的需要很方便的选择或者更改日志实现的组件,而日志实现就是具体实现日志输出。
常见的日志门面包含:commons-logging(之前叫 Jakarta Commons Logging,JCL)和slf4j(全称为Simple Logging Facade for JAVA)
常见的日志实现:Log4j,LogBack,jdk自带的日志实现
我们在搭建日志系统时根据需要选择日志门面和日志实现,常用的搭配是:commons-logging和Log4j,slf4j和LogBack,slf4j和Log4j等,注意不同的搭配所依赖的包是不同的,后面我们在将不同的日志系统搭配时会进行介绍,还要特别注意的是有些依赖包也包含日志的依赖,这样有时就会造成不同版本间的冲突,甚至会造成日志系统的不生效。
日志门面介绍
是apache提供的一个通用的日志接口,也是最早出现的日志门面接口。common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的第三方日志库。当然,common-logging内部有一个Simple logger的简单实现,但是功能很弱。所以使用common-logging,通常都是配合着log4j来使用。
优点:使用它的好处就是,代码依赖是common-logging而非log4j, 避免了和具体的日志方案直接耦合,在有必要时,可以更改日志实现的第三方库。
缺点:common-logging通过动态查找的机制,在程序运行时自动找出真正使用的日志库。由于它使用了ClassLoader寻找和载入底层的日志库, 导致了象OSGI这样的框架无法正常工作,因为OSGI的不同的插件使用自己的ClassLoader。 OSGI的这种机制保证了插件互相独立,然而却使Apache Common-Logging无法工作。
动态查找原理:
Log 是一个接口声明。LogFactory 的内部会去装载具体的日志系统,并获得实现该Log 接口的实现类。LogFactory 内部装载日志系统的流程如下:
类似于Apache Common-Logging,也是对不同日志框架提供的一个门面封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。但是,他在编译时静态绑定真正的Log库。使用SLF4J时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合(各种桥接包)。
优点:
缺点:
静态绑定原理:SLF4J 会在编译时会绑定import org.slf4j.impl.StaticLoggerBinder; 该类里面实现对具体日志方案的绑定接入。任何一种基于slf4j 的实现都要有一个这个类。如:org.slf4j.slf4j-log4j12-1.5.6: 提供对 log4j 的一种适配实现。注意:如果有任意两个实现slf4j 的包同时出现,那么就可能出现问题。
原文:https://www.cnblogs.com/htyj/p/12022533.html