在程序运行的过程中,我们需要在重要的代码逻辑分支点,将关键的程序运行状态信息打印出来,便于我们对程序调试和观察。java项目中有成熟高性能的日志框架,很方便地集成到项目中实现我们对关键信息的打印输出。

         当前java主流的日志框架有logback、log4j2、log4j1、jul等。

日志框架

简介

logback

Ceki Gulcu于2006年设计的又一个开源日志框架,解决log4j1性能问题,目标是替代log4j1

log4j1

Ceki Gulcu于2000年设计的日志框架,Apache开源项目,目前已不再维护

log4j2

2010年起Apache开源项目,参考logback,解决log4j1设计缺陷及性能问题。采用LMAX Disruptor高性能线程间消息库,据官方性能测试比logback高。

jul

java.util.logging

Since JDK1.4.0 2002年发布

        日志门面框架主要有SLF4J(Simple Logging Facade for Java)、JCL(Jakarta Commons Logging)。日志门面是日志输出的抽象接口,具体日志操作实现还需要调用具体的日志框架,日志门面框架可以方便地切换具体的日志框架,而无需修改代码。SLF4J支持logback、log4j1、logj2、jul,而JCL仅支持log4j1、jul。目前SLF4J比JCL流行,SpringBoot项目默认引入SLF4J+logback日志框架。

应用项目中如何统一日志输出呢?

        在java项目中我们经常会引入不同的组件类库,这些组件类库有使用到的日志框架也不尽相同,不过最新的组件类库一般都使用了日志门面框架,由开发者根据项目情况引入具体的日志框架。如Spring框架、Fastjson组件等使用JCL门面日志框架,而Mybatis、Quartz等常见组件默认使用SLF4J。下面我们就SLF4J如何统一日志框架进行说明。

        下图为SLF4J官网给出的技术原理图:

java常见的日志收集工具 java统一日志收集_spring boot

         如上图,jcl日志通过jcl-over-slf4j.jar桥接将日志输出到slf4j-api,进而由具体的日志框架输出;类似的,log4j1通过log4j-over-slf4j.jar桥接,jul日志通过jul-to-slf4j.jar桥接,而最新的log4j2通过log4j-to-slf4j.jar进行桥接。

        具体的pom.xml配置如下(参考):

        

java常见的日志收集工具 java统一日志收集_log4j_02

        注:未引入jcl-over-slf4j.jar,是因为jcl在没有引入log4j1时,默认使用jul输出日志,最终由jul-to-slf4j.jar进行桥接到slf4j上。

Springboot自动引入的日志框架

        当创建Springboot项目,通过pom继承spring-boot-starter-parent,或项目中引入spring-boot-starter-web等jar时,则项目会自动默认引入spring-boot-starter-logging,通过分析其pom依赖:

        1.5.9.RELEASE:

java常见的日志收集工具 java统一日志收集_spring_03

         2.0.0.RELEASE

java常见的日志收集工具 java统一日志收集_java常见的日志收集工具_04

1

spring-boot-starter-logging默认使用logback日志框架

2

springboot logging已自动将日志统一到logback日志框架

3

spring-boot-starter-logging 2.0.0之后的版本,都移除了log4j1遗留日志兼容问题(毕竟log4j1不维护以很久,许多主流框架类库已采用其他日志框架),而增加了log4j2桥接到logback的配置

        综上分析,只要Spingboot项目引入了spring-boot-starter-logging,即可将项目日志统一到logback日志框架,从而可灵活控制日志的输出格式或者归集日志到统一的日志中心。