本文共 4386 字,大约阅读时间需要 14 分钟。
作为一名 Java 程序员,日常开发工作中肯定会接触日志系统,但是众多的框架,包括 Log4j、Log4j2、Logback、Slf4j、Apache Common logging 等等,引用的 maven 依赖众多,到底可以去掉哪些,一行 LoggerFactory.getLogger(LogbackTest.class)
后做了哪些工作,怎么去找的配置文件,这些还是有很多细节可以去研究的。
目前的日志框架有 jdk 自带的 logging,log4j1、log4j2、logback ,这些框架都自己定制了日志 API ,并且有相应的实现;目前用于实现日志统一的框架 Apache commons-logging、slf4j ,遵循「面向接口编程」的原则,这两大框架可以让用户在程序运行期间去选择具体的日志实现系统(log4j1\log4j2\logback等)来记录日志,是统一抽象出来的一些接口。
这些日志系统涉及到的繁杂的各种集成 jar 包,如下:
log4j Apache 的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;用户也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,用户能够更加细致地控制日志的生成过程。这些可以通过一个 配置文件来灵活地进行配置,而不需要修改程序代码。最新的目前版本为log4j 1.2
,maven 依赖如下:
log4j log4j 1.2.17
Logback Logback 是由 log4j 创始人设计的又一个开源日记组件,Logback 当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块,logback-classic是log4j的一个 改良版本。此外logback-classic 完整实现 SLF4J API 使你可以很方便地更换成其它日记系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日记的功能。maven 最新依赖如下:
ch.qos.logback logback-core 1.1.6 ch.qos.logback logback-classic 1.1.6 org.slf4j slf4j-api 1.7.18
更快的执行速度Logback 作为一个通用可靠、快速灵活的日志框架,将作为 Log4j 的替代和 SLF4J 组成新的日志系统的完整实现。Logback 声称具有极佳的性能,“ 某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在LogBack中需要3纳秒,而在Log4J中则需要30纳秒。 LogBack 创建记录器(logger)的速度也更快:13微秒,而在Log4J中需要23微秒。更重要的是,它获取已存在的记录器只需94纳秒,而 Log4J需要2234纳秒,时间减少到了1/23。跟JUL相比的性能提高也是显著的”。另外,Logback的所有文档是全面免费提供的,不象Log4J那样只提供部分免费文档而需要用户去购买付费文档。具体包括:
详细的介绍可以参考:
越来越多的开源项目依赖 Logback:
SLF4J 简单日记门面(Facade) SLF4J 是为各种 loging APIs 提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。 Logging API实现既可以选择直接实现SLF4J接的loging APIs如: NLOG4J、SimpleLogger。也可以通过SLF4J提供的API实现来开发相应的适配器如Log4jLoggerAdapter、JDK14LoggerAdapter。
Apache Common-Logging 目前广泛使用的Java日志门面库。通过动态查找的机制,在程序运行时自动找出真正使用的日志库。但由于它使用了ClassLoader寻找和载入底层的日志库, 导致了象OSGI这样的框架无法正常工作,由于其不同的插件使用自己的ClassLoader。 OSGI的这种机制保证了插件互相独立,然而确使Apache Common-Logging无法工作。
SLF4J 库类似于 Apache Common-Logging。但是,他在编译时静态绑定真正的Log库。使用SLF4J时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合,如此便可以在OSGI中使用了。另外,SLF4J 支持参数化的log字符串,避免了之前为了减少字符串拼接的性能损耗而不得不写的if(logger.isDebugEnable())
,现在你可以直接写:logger.debug(“current user is: {}”, user)
。拼装消息被推迟到了它能够确定是不是要显示这条消息的时候,但是获取参数的代价并没有幸免。同时,日志中的参数若超过三个,则需要将参数以数组的形式传入,如:
Object[] params = {value1, value2, value3};logger.debug(“first value: {}, second value: {} and third value: {}.”, params);
现在,Hibernate、Jetty、Spring-OSGi、Wicket和MINA等越来越多的开源项目都已经迁移到了SLF4J,由此可见SLF4J的影响力不可忽视。
介绍完这些日志框架后,那么这些东西怎么用,之间的依赖是什么样子的,还有启动初始化的过程究竟干了什么,怎么找到相应的实现类及配置的?
这四篇文章是我目前在互联网上面发现的写的最详细的介绍,请参考:
org.slf4j slf4j-api 1.7.7 ch.qos.logback logback-core 1.1.3 ch.qos.logback logback-classic 1.1.3 org.slf4j slf4j-log4j12 99.0-does-not-exist org.slf4j log4j-over-slf4j 1.7.14-SNAPSHOT org.slf4j jcl-over-slf4j 1.7.7 log4j log4j 99.0-does-not-exist apache-log4j log4j 999-not-exist
通过上述阅读,对「混乱的 java 日志体系」应该有了较清楚的理解,但是真的存在项目需要切换日志系统的情况吗?根据我的理解,很多当你的系统越来越庞大,越来越复杂需要系统重构,解决性能的时候,可以考虑升级你当前的日志配置。如果你是新启用的项目,直接考虑使用Logback + SLF4j
即可。
参考资料
参考:
(以上内容转自此篇文章)
==>如有问题,请联系我:easonjim#163.com,或者下方发表评论。<==转载地址:http://ikwsx.baihongyu.com/