JAVA基础 - JAVA中经常使用的日志框架有哪些?

写在前面

在JAVA中我们经常听到:Commons Logging、SLF4J、Log4j,Log4j2,Logback,Jul等框架或者实现方案,他们之间有什么区别呢?

接口与实现

1.  定义标准日志接口的框架,如:Commons Logging、SLF4J、JCL(Jakarta Commons Logging)、jboss-logging;
2.  实现标准日志接口定义的具体实现方案,如:Log4jLog4j2LogbackJava Util Logging(Jul)、slf4j-simple、slf4j-nop。
3.  Logback、slf4j-simple、slf4j-nop直接原生实现了slf4j的接口;
4.  Log4jLog4j2Java Util Logging(Jul)没有直接实现slf4j接口,所以需要对应的适配类将SLF4J接口和具体实现类进行绑定(也就是说除了接口和实现类两个依赖外,还需要一个桥接包用于将接口和实现进行绑定)。

区别

A. JDK Logging(日志实现方案)

Java标准库内置了日志包java.util.logging, Logger logger = Logger.getGlobal();
Logging系统在JVM启动时读取配置文件并完成初始化,一旦开始运行main()方法,就无法修改配置;
可以在JVM启动时传递参数-Djava.util.logging.config.file=<config-file-name>

B. Commons Logging(日志接口标准)

Commons Logging是一个第三方日志库,它是由Apache提供的日志模块;
它可以挂接不同的日志系统,并通过配置文件指定挂接的日志相关参数;
默认情况下,Commons Loggin自动搜索并使用Log4j,如果没有找到Log4j,再使用JDK Logging。搜索逻辑如下:
(1)首先在CLASSPATH下寻找commons-logging.properties文件,如果可以找到,则使用文件中定义的Log实现类,
如果找不到,则再查找是否已定义系统环境变量org.apache.commons.logging.Log,如果可以找到,则使用其定义的Log实现类,
如果找不到,则进行第(2)步;
(2)查看CLASSPATH中是否有Log4j的包,如果可以找到,则自动使用Log4j作为日志实现类,如果找不到,则进行第(3)步;
(3)使用JDK自身的日志实现类(JDK1.4以后才有日志实现类),如果找不到,则进行第(4)步;
(4)使用commons-logging自己提供的一个简单的日志实现类SimpleLog
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class UserServiceImpl implements IUserService {
	public static final Log log = LogFactory.getLog(UserServiceImpl.class);
}

C. Log4j(日志实现方案)

Log4jApache开源的一个日志接口的实现框架。
Commons Logging,可以理解为“日志接口”;而真正的“日志实现”可以使用Log4j;

D. Log4j2(日志实现方案)

Apache Log4j2是对 Log4j 的升级,它比其前身 Log4j1.x 提供了重大改进,并提供了 Logback 中可用的许多改进,同时修复了 Logback 架构中的一些固有问题。
与 Logback 一样,Log4j2 提供对 SLF4J 的支持,自动重新加载日志配置,并支持高级过滤选项。 
除了这些功能外,它还允许基于 lambda 表达式对日志语句进行延迟评估,为低延迟系统提供异步记录器,并提供无垃圾模式以避免由垃圾收集器操作引起的任何延迟。

E. SLF4J(日志接口标准)和Logback(日志实现方案)

SLF4J的全称是Simple Loging Facade For Java(Java简单日志门面),它仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,具体有哪些接口,全部都定义在slf4j-api中了;
它像JDBC一样,只是一种规则而已, 所以单独的SLF4J是不能工作的,必须搭配其他具体的日志实现方案,比如Apacheorg.apache.log4j.Logger或者是JDK自带的java.util.logging.Logger等等;
SLF4J类似于Commons Logging,也是一个日志接口,Logback类似于Log4j,是一个日志的实现;
SLF4J和Logback可以取代Commons LoggingLog4j;
SLF4J是简单的日志外观模式框架,抽象了各种日志框架(LogbackLog4jCommons-logging和JDK自带的logging)的实现接口,SLF4J没有替代任何日志框架,它仅仅是标准日志框架的外观模式;
SLF4J使得用户可以在部署时使用自己想要的日志实现框架,SLF4J是轻量级的,在性能方面几乎是零消耗的;
如果在类路径下除了SLF4J再没有任何日志实现框架,那么默认状态就是在控制台输出日志。

Logback是由log4j创始人设计的又一个开源日志组件,logogback当前分成三个模块:logback-core,logback- classic和logback-access;
logback-core是其它两个模块的基础模块;
logback-classic是log4j的改良版本,logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging;
logback-access访问模块与Servlet容器集成提供通过Http方式访问日志的功能;
SLF4J结合Logback(它会自动包含所有的依赖包logback-core、slf4j-api……)

所以添加下面的依赖即可完成日志系统的配置:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.30</version>
  <scope>compile</scope>
</dependency>

<dependency>
 <groupId>ch.qos.logback</groupId>
 <artifactId>logback-core</artifactId>
 <version>1.2.5</version>
</dependency>

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.2.5</version>
</dependency>

日志级别

日志级别由低到高: trace < debug < info < warm < error  设置的级别越低显示的日志信息越多。
可以调整输出的日志级别,只会显示高于设置级别的日志。

依赖引入

在这里插入图片描述
在项目中引入日志系统,一般会引入三种包:接口包、实现包、接口实现的连接件。

<!-- SLF4J结合Log4j的连接件 -->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.2</version>
</dependency>

<!-- SLF4J结合JUL(java.util.logging)的连接件 -->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-jdk14</artifactId>
  <version>1.7.2</version>
</dependency>
接口与实现的组合依赖
SLF4J和Logbackslf4j-api-N.jar、logback-classic-N.jar、logback-core-N.jar
SLF4J和Log4jslf4j-api-N.jar、slf4j-log4j12-N.jar、log4j-N.jar
SLF4J和JDKslf4j-api-N.jar、slf4j-jdk14.jar
SLF4J和Simpleslf4j-api-N.jar、slf4j-simple-N.jar

总结

1.  SLF4J相比较Commons Logging开销更低;
2.  Logback文档全部免费;
3.  Logback相比Log4jLog4j2拥有更好的性能;
4.  Log4j2相对于Log4J1更优。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值