说说java的日志框架体系是怎样的

更新时间:02-01 教程 由 |唁 分享

说说java的日志框架体系是怎样的?

Apache Commons Logging(JCL)-日志门面

Commons本身只提供日志接口,具体实现在运行时 动态寻找对应组件?思路上类似于JDBC的抽象。

JCL动态查找(绑定)日志组件原理如下:

JCL为每一种日志采用了一个适配器,具体采用哪一个,是动态根据指定顺序查找classpath是否存在相应日志的实现,如果JCL运行时没有找到任何一种第三方的日志实现,则就使用jdk14自带的java.util.logging(JUL)。

Spring日志就是采JCL,解决了应用程序和框架日志不统一的问题,动态去寻找(应用程序配置)日志体系的实现。

默认的LogFactory是按照下列的步骤去发现并决定那个日志工具将被使用的,LogFactory按照顺序寻找,找到第一个工具后中止。

1) 首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则

使用其中定义的Log实现类;

2) 如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量

org.apache.commons.logging.Log,找到则使用其定义的Log实现类;

3) 否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类;

4) 否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);

5) 否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog;

SLF4j(Simple Logging Facade for java)-日志门面

与JCL类似,本身不提供具体实现,只对外提供接口或者门面,因此它不是具体的日志解决方案,而是通过Facade Pattern 门面模式对外提供一些 java logging api,这些对外提供的核心API就是一些接口以及LoggerFactory的工程类。

与Common logging 不同的是其采用在ClassPath下寻找一下jar包来表示具体的采用哪种实现

slf4j-log4j12.jar(表示指定logh4j)slf-jdk14.jar(表示使用JUL)slf4j-jcl.jar(表示使用JCL)log4j-slf4j-impl.jar(表示指定log4j2)logback-classic(logback)

SLF4j 静态绑定日志组件原理:

使用SLF4j,如果你需要使用某一种日志实现,那么你选择相对应的SLF4j的桥接包即可。

SLF4j提供了统一记录日志的接口(LoggerFactory),只要接其提供的方法记录即可。

logback是slf4j-api的天然实现,不需要你桥接包就可以使用。

上面的slf4j-log4j2,log4j-slf4j-impl,slf4j-jcl,slf4j-jdk14都是日志适配器

日志门面适配器,因为slf4j规范是后来提出来的,在此之前的日志库是没有实现slf4j的接口的,例如log4j;所以,在工程里要想使用 slf4j + log4j 的模式,就额外需要一个适配器(slf4j-log4j2)来解决接口不兼容的问题。日志库适配器,在一些老的工程里,一开始为了开发简单而直接使用了日志库API来完成日志打印,随着时间的推移向将原来直接调用日志库的模式改为业界标准的门面模式(例如 slf4j+logback结合),但老工程代码里打印的日志的地方太多,难以改动,所以需要一个适配器来完成从旧日志库的API到slf4j的路由,这样不改动原有代码的情况下也能使用slf4j来统一管理日志,而且后续自由替换具体日志库也不成问题。日志集成--slf4j + logback

如果是新工程,则推荐使用slf4j + logback 模式,因为logback自身实现了slf4j的接口,无需额外引入适配器,另外logback是log4j的升级版,具备比log4j更多的优点。

日志集成-log4j + slf4j

如果是老工程,则需要根据所使用的日志库来确定门面适配器,通常情况下老工程使用的都是log4j, 因此以log4j日志库为例,可通过以下集成。

如果老老工程直接使用了log4j日志库提供的接口来打印日志,则还需要引入日志适配器,配置如下:

日志集成-Spring日志 + log4j2

我们应用使用的是log4j2打印日志;而Spring采用的JCL中不包含log4j2,运行时,JCL从ClassPath下寻找日志的实现,如果没有引用其他实现,最终会使用JUL实现。如下图:

这时候会出现什么问题呢?

Spring打印日志和应用程序的打印日志不统一,错误排除还比较困难,而且应用程序和Spring框架,日志不统一,太乱了。

为了让Spring和我们的应用程序,采用统一的log4j2日志体系,需要加入适配器,改善上面应用程序和框架日志的统一问题(加入适配器后),如下图:

SLF4j+log4j2

SLF4j集成其他日志框架的方法:

常见的日志组件最佳实践

在使用SLF4J使用时,需要注意一下事项:

logger被定义为static 变量,是因为这个LOGGER与当前类绑定,避免每次都new一个新对象,造成资源浪费。

再次感谢邀请!如果对你有帮助,可以关注一下!

声明:关于《说说java的日志框架体系是怎样的》以上内容仅供参考,若您的权利被侵害,请联系13825271@qq.com
本文网址:http://www.25820.com/tutorial/14_5787003.html