日志是软件系统的“基础设施”,它可以帮助我们了解系统的运行轨迹,查找系统的运行异常等。很多人都没有引起对日志的重视。
下面我们先来设定几个实际项目项目的场景:
1、xxx物流云系统,公司在给货车司机打款的时候,司机没收到账款。司机在线等,没收到账款,就不继续跑了;
2、xxx商城小程序,给用户进行退款的时候,用户没有收到钱,然后要举报公司。。。;
3、线上系统挂了,待找原因,待上线等。
这些都属于很严重的生产事故了,直接影响公司的运营。然而,这些问题的解决,通常在要日志中查找原因(当然,日志的作用不限于此),然后解决。
我们见过最多的日志相关的代码莫过于System.out.println("");,log4j 这两种了。下面我们来说说 SpringBoot 中日志框架的使用。
目前市面上的日志框架有:
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j....
log4j log4j 是 Apache 的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、数据库等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
Log4j有7种不同的log级别,按照等级从低到高依次为:TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFF。如果配置为OFF级别,表示关闭 log。
Log4j支持两种格式的配置文件:properties和xml。
包含三个主要的组件:Logger、appender、Layout。
slf4j slf4j,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,而是通过Facade Pattern提供一些Java logging API,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。作者创建SLF4J的目的是为了替代Jakarta Commons-Logging。
实际上,slf4j 所提供的核心API是一些接口以及一个 LoggerFactory 的工厂类。在使用 slf4j 的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。slf4j 提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
适用场景:
如果你开发的是类库或者嵌入式组件,那么就应该考虑采用 slf4j,因为不可能影响最终用户选择哪种日志系统。在另一方面,如果是一个简单或者独立的应用,确定只有一种日志系统,那么就没有使用 slf4j 的必要。假设你打算将你使用 log4j 的产品卖给要求使用 JDK 1.4 Logging 的用户时,面对成千上万的 log4j 调用的修改,相信这绝对不是一件轻松的事情。但是如果开始便使用slf4j,那么这种转换将是非常轻松的事情。
Logback,一个“可靠、通用、快速而又灵活的Java日志框架”。
logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core 是其它两个模块的基础模块。logback-classic 是 log4j 的一个改良版本。此外logback-classic 完整实现 SLF4J API 使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access 访问模块与 Servlet 容器集成提供通过Http来访问日志的功能。
Java提供了自己的日志框架,类似于 slf4j,但是API并不完善,对开发者不是很友好,而且对于日志的级别分类也不是很清晰,比如:SEVERE, WARNING, INFO, CONFIG, FINE,FINER, FINEST。所以不推荐使用这种方式输出日志。
JCLJakarta Commons Logging 和 slf4j 非常类似,也是提供的一套API来掩盖了真正的 logger 实现。便于不同的 logger 的实现的替换,而不需要重新编译代码。缺点在于它的查找 logger 的实现者的算法比较复杂,而且当出现了一些class loader之类的异常时,无法去修复它。
Log4j 2已经有很多其他的日志框架对 slf4j 进行了改良,比如说 slf4j、logback 等。而且 log4j2 在各个方面都与 logback 非常相似,那么为什么我们还需要 log4j2 呢?
插件式结构。log4j2 支持插件式结构。我们可以根据自己的需要自行扩展 log4j2 , 我们可以实现自己的 appender、logger、filter;
配置文件优化。在配置文件中可以引用属性,还可以直接替代或传递到组件。而且支持json格式的配置文件。不像其他的日志框架,它在重新配置的时候不会丢失之前的日志文件;
Java 5 的并发性。log4j2 利用Java 5中的并发特性支持,尽可能地执行最低层次的加锁。解决了在 log4j1.x 中存留的死锁的问题。如果你的程序仍然在饱受内存泄露的折磨,请毫不犹豫地试一下 log4j2 吧;
异步 logger。log4j2 是基于 LMAX Disruptor库的。在多线程的场景下,和已有的日志框架相比,异步的 logger 拥有10左右的效率提升。