Java 日志框架体系

开发者都在用什么日志实现框架

名称 jar包 描述
log4j log4j-1.2.17.jar 早期常用日志产品
logback logback-core,logback-classic,logback-access 一套日志组件的实现,性能优于log4j
log4j2 log4j,log4j-api,log4j-core apache开发的一款log4j的升级产品
java.util.logging jdk(JUL) Java1.4以来官方的日志实现框架,无需第三方依赖

日志接口框架(日志门面框架)

如果我要写一个技术框架,应该采用哪种日志实现框架呢

应该是什么都不选,而是采用日志接口框架。

什么是日志接口框架?是时候祭出这两:

  • Apache Commons Logging (JCL)
  • SLF4j

这一点可以学习下 Mybatis,它的内部就是采用了 SLF4j 并且做了适配

Apache Commons Loging (JCL)

JCL 本身只提供⽇志接⼝,具体实现在运⾏时动态寻找对应组件?⽐如:
log4j、jdk14looger 等。

JCL实现逻辑

通过 jcl 的源码可看出,jcl 为每⼀种⽇志实现采⽤了⼀个适配器,具体采⽤哪个是根据动态的指定顺序查找 classPath 是否存在相应的实现。

如果⼀个应⽤当中有多个 classLoader。⽐如 OSGI 规定了每个模块都有其独⽴的 ClassLoader 。

这种机制保证了插件互相独⽴, 同时也限制了 JCL 在 OSGi 中的正常使⽤。

这时出现了slf4j 基于静态绑定的⽅式解决了这个问题。

SLF4J

全称 Simple Logging Facade for Java(简单⽇志⻔⾯)。

与 JCL 类似,本身不替供⽇志具体实现,只对外提供接⼝或⻔⾯。

与 JCL 不同的是其采⽤在 classPath 加⼊适配器.

通过 jar 包来表示具体采⽤哪种实现 :

  • slfj-log4j12.jar (表示桥接 log4j)
  • slf4j-jdk14.jar(表示桥接jdk Looging)
  • slf4j-jcl.jar(表示桥接jcl)
  • log4j-slf4j-impl(表示桥接log4j2)
  • logback-classic(表示桥接logback)

再谈 SLF4J

这是目前最好的日志接口系统

假设你们系统当中之前在⽤ JCL 打印⽇志,但这时想加⼊slf4j来打印⽇志,就会出现两类⽇志输出如何解决?

只要classPath 当中指定 sfl4j 适配器包即可⽆缝将原⽇志输出转移动slf4j上来。

  • jcl-over-slf4j:转移jcl ⽇志⾄slf4j
  • log4j-over-sl4j:转移log4j ⽇志⾄ slf4j
  • jul-over-sl4j:转移jul ⽇志⾄ slf4j

这里使用了日志桥接器

所谓的桥接,其实就是把对应的代码全部重写一遍,替换关键的实现逻辑

SLF4J 各组件汇总

名称 描述 JAR包
⻔⾯ slf4j API接⼝ slf4j-api.jar
适配器 ⽤于slf4j 连接对应⽇志实现 slfj-log4j12.jar 、slf4jjdk14.jar、log4j-slf4jimpl、logback-classic、slf4j-jcl.jar
桥接器 ⽤于将原⽇志输出⽆缝转移到slf4j jcl-over-slf4j、log4j-oversl4j、jul-over-sl4j
实现 ⽇志的具体实现 log4j、logback、log4j2、java.util.looging

SLF4J 各种框架集成方案

Spring Boot⽇志应⽤

默认实现

spring boot 的默认⽇志实现是 logback,它通过spring-boot-starter-logging 引⼊,可直接在默认配置⽂件配置。

#开启Debug
debug=true

#指定日志目录
logging.file.path=/Users/tommy/git/coderead-spring-boot/

#指定日志文件
logging.file.name=hello.log

#单个日志文件大小
logging.file.max-size=10MB

#日志文件保存30天的
logging.file.max-history=30

#日志归档的总大小,当日志存档的总大小超过该阈值时,将删除备份。
logging.file.total-size-cap=300MB

#日志输出表达示
logging.pattern.console=%-4relative [%thread] %-5level %logger{30} ====
%msg%n

#指定包日志级别
logging.level.coderead=debug

#指定整个WEB项目的 日志输出级别
logging.level.web=info

#指定 com.shar.test 下面日志输出级别
logging.level.com.shar.test=debug

也可通过独⽴的配置⽂件,进⾏更精准的配置,默认情况下⽤ logback 的配置⽂件,可选名称有:

logback.xml
logback-spring.xml

log4j2 实现

spring boot 共有两个⽇志启动器?另⼀个是spring-boot-starter-log4j2,只能同时引⼊⼀个,所以得排除另⼀个。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!--排除默认选择器 -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
    </dependency>
<!-- 引入log4j2-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

默认配置不变,但是要更精准控制,就需要引⼊ log4j2.xml 或 log4j2-spring.xml


转载请注明来源。 欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。 可以在下面评论区评论,也可以邮件至 sharlot2050@foxmail.com。

文章标题:Java 日志框架体系

字数:1.1k

本文作者:夏来风

发布时间:2020-11-22, 09:38:36

原始链接:http://www.demo1024.com/blog/java-log/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。