日志框架分析:https://blog.csdn.net/congyihao/article/details/68926625
实战:https://zhuanlan.zhihu.com/p/24275518

log - 图1
两套接口:JCL(Apache Common Logging,org.apache.commons.logging.Log) 和 SLF4J(org.slf4j.Logger)

实现:
JCL:

  • Log4j(org.apache.logging.log4j.Logger)
  • JUL(Java Util Log,java.util.logging.Logger)

SLF4J:

  • Logback(ch.qos.logback.classic.Logger)
  • slf4j-nop
  • slf4j-simple
  • Log4j 和 JUL 都可以通过中间包桥接到 SLF4J

slf4j

Simple Loging Facade For Java,即它仅仅是一个为 Java 程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如 JDBC 一样,只是一种规则而已。所以单独的 slf4j 是不能工作的,必须搭配其他具体的日志实现方案,比如 apache 的 org.apache.log4j.Logger,jdk 自带的 java.util.logging.Logger 等

JCL:没提供参数化的字符串拼接,所以会导致即使不打印日志,也会执行字符串拼接,必须先判断是否打开 debug

  1. if (logger.isDebugEnabled()) {
  2. logger.debug("start process request, url:" + url);
  3. }

slf4j 就可以参数化打印日志,不过对于对象来说,可能也需要判断 isDebugEnabled 来避免 toString():

  1. logger.debug("start process request, url:{}", url);

log4j

logback