Java常用的日志框架对比和深入分析
前言
作为一名资深的开发人员,对于日志记录框架一定不会很陌生。而且几乎在所有应用里面,一定会用到各种各样的
日志框架用来记录程序的运行信息。而对于一个成熟的java应用,这个是必不可少的。在开发和调试阶段,日志可以帮助我们更快的定位问题;而在应用的运维过程中,日志系统又可以帮助我们记录大部分的异常信息,通常很多企业会通过收集日志信息来对系统的运行状态进行实时监控预警。那么,你对日志框架到底有多了解呢?
常用的日志框架
Log4j
Log4j是apache下一个功能非常丰富的java日志库实现,Log4j应该是出现比较早而且最受欢迎的java日志组
件,它是基于java的开源的日志组件。Log4j的功能非常强大,通过Log4j可以把日志输出到控制台、文件、用户界面。也可以输出到操作系统的事件记录器和一些系统常驻进程。值得一提的是:Log4j可以允许你非常便捷地自定义日志格式和日志等级,可以帮助开发人员全方位的掌控自己的日志信息
Log4j2
Log4j2是Log4j1的升级版本。Log4j2基本上把Log4j版本的核心全部重构掉了,而且基于Log4j做了很多优化和改变
Logback
Logback是由Log4j创始人设计的另一个开源日志组件,也是作为Log4j的替代者出现的。而且官方是建议和
Slf4j一起使用,你们一定不知道Logback、slf4j、Log4j都是出自同一个人吧。 Logback是在Log4j的基础上做的改进版本,而Slf4j又是同一个人设计的,所以默认就对Slf4j无缝结合。
JDK-Logging
Jdk1.4版本以后开始提供的一个自带的日志库实现
统一日志模块
目前市面上有两个用得比较广泛的统一日志规范接口,分别是
SLF4j
SLF4j(Simple Logging Facade For Java)是基于API的java日志框架,SLF4j提供了一个简单统一的日
志记录接口,开发者在配置和部署时,只需要实现这个接口就可以实现日志功能。可以说,它并不是一个具体的日志解决方案,它只是服务于各种各样的日志系统,允许最终用户在部署应用上使用自己常用的日志系统
Commons-Logging
Common-logging 为众多具体的日志实现库提供了一个统一的接口,和SLF4j的作用类似,它允许在运行时绑定任意的日志库;
这里其实有个小故事,当年apache说服Log4j以及其他的日志框架按照Commons-Logging的标准来编写,但是由于Commons-Logging的类加载有点问题,实现起来不友好。因此Log4j的作者就创作了Slf4j,也因此与Commons-Logging两份天下
图说几个日志框架的关系
各个日志的功能演示
各个日志模块的功能演示和配置说明,我就不做多说了,网上搜索下一抓一大把,都讲得很详细。
slf4j和各个日志框架集成的原理
这里要重点说明一个东西,就是slf4j通过一个非常有趣而且很牛的设计,把各个日志框架去集成进来。
如果你们去看slf4j的源码,在LoggerFactory.java里面有一个这样的静态全局变量
private static String STATIC_LOGGER_BINDER_PATH = "org/slf4j/impl/StaticLoggerBinder.class";
还有一段核心代码
static Set findPossibleStaticLoggerBinderPathSet() { LinkedHashSet staticLoggerBinderPathSet = new LinkedHashSet(); try { ClassLoader ioe = LoggerFactory.class.getClassLoader(); Enumeration paths; if(ioe == null) { paths = ClassLoader.getSystemResources(STATIC_LOGGER_BINDER_PATH); } else { paths = ioe.getResources(STATIC_LOGGER_BINDER_PATH); } while(paths.hasMoreElements()) { URL path = (URL)paths.nextElement(); staticLoggerBinderPathSet.add(path); } } catch (IOException var4) { Util.report("Error getting resources from path", var4); } return staticLoggerBinderPathSet; }
大家对ClassLoader机制了解的同学,这段代码看起来就非常容易懂了,通过ClassLoader去加载classpath下所有存在StaticLoggerBinder.class的文件。找到这个文件以后加到一个集合里面。通过加载到对应jar中的StaticLoggerBinder。来获取实例。
public static ILoggerFactory getILoggerFactory() { if (INITIALIZATION_STATE == UNINITIALIZED) { synchronized (LoggerFactory.class) { if (INITIALIZATION_STATE == UNINITIALIZED) { INITIALIZATION_STATE = ONGOING_INITIALIZATION; performInitialization(); } } } switch (INITIALIZATION_STATE) { case SUCCESSFUL_INITIALIZATION: return StaticLoggerBinder.getSingleton().getLoggerFactory(); case NOP_FALLBACK_INITIALIZATION: return NOP_FALLBACK_FACTORY; case FAILED_INITIALIZATION: throw new IllegalStateException(UNSUCCESSFUL_INIT_MSG); case ONGOING_INITIALIZATION: // support re-entrant behavior. // See also http://jira.qos.ch/browse/SLF4J-97 return SUBST_FACTORY; } throw new IllegalStateException("Unreachable code"); }
在这段代码里面,可以看到有一个StaticLoggerBinder.getSingleton().getLoggerFactory()
这个就是在第三方的集成包中返回的实例。这个就是slf4j里面比较核心的一块
欢迎工作一到五年的Java程序员朋友们加入Java架构开发:744677563
本群提供免费的学习指导 架构资料 以及免费的解答
不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导
进群修改群备注:开发年限-地区-经验
方便架构师解答问题
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android开发bug收集(疑难bug 持续更新)
一、关于FloatingActionButton的bug 1、错误信息: Error inflating class android.support.design.widget.FloatingActionButton 2、解决方法: 将android:backgroundTint="#ffffff"换成app:backgroundTint="#ffffff" 某次删除一个adapter之后出现的bug 1、错误信息: The activity must be exported or contain an intent-filter bug显示 2、解决策略: 点击下拉框选择app,即可运行 解决方法 二、关于 A/chromium: [FATAL:jni_android.cc(243)] Please include Java exception stack in crash report 的bug 1、错误信息 A/chromium: [FATAL:jni_android.cc(243)] Please include Java exception stack in crash r...
- 下一篇
安装 TensorFlow
安装 TensorFlow 我们已在如下配置的 64 位笔记本电脑/台式机操作系统中构建并测试过 TensorFlow: MacOS X 10.11 (El Capitan) 或更高版本 Ubuntu 16.04 或更高版本 Windows 7 或更高版本 也许您能在其他笔记本电脑或台式机系统上安装 TensorFlow,但我们只支持上述配置(且只会修复这些配置中的问题)。 下列指南介绍了如何安装让您可以使用 Python 编写应用的 TensorFlow 版本: 在 Ubuntu 上安装 TensorFlow 在 macOS 上安装 TensorFlow 在 Windows 上安装 TensorFlow 从源代码安装 TensorFlow Python TensorFlow API 的许多方面都已从版本 0.n 升级为 1.0。以下指南介绍了如何将旧版 TensorFlow 应用迁移到版本 1.0: 转换到 TensorFlow 1.0 下列指南介绍了如何安装 TensorFlow 库以搭配其他编程语言使用。这些 API 的作用是在应用中部署 TensorFlow 模型,因此功能不像...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS关闭SELinux安全模块
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7设置SWAP分区,小内存服务器的救世主
- Red5直播服务器,属于Java语言的直播服务器
- Docker快速安装Oracle11G,搭建oracle11g学习环境