Java常用的日志框架对比和深入分析

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 前言作为一名资深的开发人员,对于日志记录框架一定不会很陌生。而且几乎在所有应用里面,一定会用到各种各样的 日志框架用来记录程序的运行信息。

前言

作为一名资深的开发人员,对于日志记录框架一定不会很陌生。而且几乎在所有应用里面,一定会用到各种各样的 

日志框架用来记录程序的运行信息。而对于一个成熟的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

本群提供免费的学习指导 架构资料 以及免费的解答

不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导

进群修改群备注:开发年限-地区-经验

方便架构师解答问题

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
12天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
34 3
|
2月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
8天前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
MySQL事务日志-Undo Log工作原理分析
|
13天前
|
Java Maven
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
|
15天前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
33 7
|
18天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
27 6
|
18天前
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
|
1月前
|
监控 应用服务中间件 定位技术
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
112 3
|
2月前
|
监控 算法 Java
jvm-48-java 变更导致压测应用性能下降,如何分析定位原因?
【11月更文挑战第17天】当JVM相关变更导致压测应用性能下降时,可通过检查变更内容(如JVM参数、Java版本、代码变更)、收集性能监控数据(使用JVM监控工具、应用性能监控工具、系统资源监控)、分析垃圾回收情况(GC日志分析、内存泄漏检查)、分析线程和锁(线程状态分析、锁竞争分析)及分析代码执行路径(使用代码性能分析工具、代码审查)等步骤来定位和解决问题。