最常见的日志框架:log4j、log4j2、logback
从JDK1.4开始提供java.util.logging日志框架来打印日志,但大佬觉得JUL太难用了,于是手撸了个log4j,后来log4j发现了安全漏洞,加上代码结构问题难以维护,于是从1.2就停止更新log4j,并重新撸了个log4j2,再后来,大佬又撸了一个性能更高、功能更全的logback。
slf4j是提供日志打印的接口,需要搭配其他日志框架来使用
log4j
//注意包路径 import org.apache.log4j.Logger; Logger logger_log4j = Logger.getLogger(Log4jDemo.class);
log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
log4j2
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; Logger logger_log4j2 = LogManager.getLogger(Log4j2Demo.class);
logback
import org.slf4j.Logger; import org.slf4j.LoggerFactory; Logger logger_logback = LoggerFactory.getLogger(LogBackDemo.class);
slf4j%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n ${LOG_HOME}/main.log ${LOG_HOME}/main.%d{yyyy-MM-dd}.log 30 %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
和log4j配合,需要导入「log4j.jar」,以及桥接包「slf4j-log412.jar」。
log4j2配合需要导入log4j2的「log4j-api.jar」、「log4j-core.jar」和桥接包「log4j-slf4j-impl.jar」
logback只需要导入「logback-classic.jar」和「logback-core.jar」即可,不需要桥接包
原理就是就是让ClassLoader从classpath(依赖的jar)中找到「StaticLoggerBinder」这个类,然后利用他来返回log4j、logback中的Logger,然后打印日志。
所谓的桥接包,就是实现StaticLoggerBinder类,用来连接slf4j和日志框架。因为log4j和log4j2刚开始没有StaticLoggerBinder这个类,为了不改变程序结构,只能重新写一个新的jar来实现StaticLoggerBinder。而logback出现slf4j之后,于是在logback本身的jar中实现了StaticLoggerBinder,所以就不需要桥接包。
StaticLoggerBinder实现了使用底层日志框架创建Logger的功能,各自的StaticLoggerBinder为slf4j提供的Logger,再提供给用户打印日志。
log4j和log4j2桥接包及logback依赖里,都有StaticLoggerBinder类。
问题logback-classic、log4j-slf4j-impl、slf4j-log412、slf4j-jdk这些jar不能同时存在。他们都实现了StaticLoggerBinder类而导致冲突,slf4j无法确定到底用哪个日志框架
参考链接
https://blog.csdn.net/ziyunmuxu/article/details/121912893



