本文共 4296 字,大约阅读时间需要 14 分钟。
目录
日志框架产生背景
1)程序媛小张,开发了一个大型系统; 2)最开始系统中使用 System.out.println("");将关键数据打印在控制台 3)后面发现这样不容易查看之前的日志信息,于是小张开发了一个小框架来记录系统的一些运行时信息,将所有运行信息统一保存到了文件中,最原始的日志框架就叫“zhanglogging.jar” 4)在不断的开发实践中,小张觉得之前的框架需要改进,决定再加几个功能:如异步模式、自动分类归档等, 改进版的框架名字叫“zhanglogging-good.jar” 5)因为日志框架升级,以前的项目如果要使用新的日志框架,那就不得不修改源码,假设哪一天又升级了日志框架叫“zhanglogging-prefect.jar”,这样反复修改项目源码仍然不太合适 6)后面发现数据库 JDBC 的数据库驱动的模式,由 Java 提供统一的 JDBC 接口,不同的数据库供应商提供实现,切换数据库的时候,只需要直接更新数据库驱动即可,并不需要修改源码 7)于是小张也写了一个统一的日志接口层,叫 “日志门面”(日志的一个抽象层),名字叫 logging-abstract.jar;然后给项目中导入具体的日志实现就行了;典型的面向接口编程! |
主流日志框架概述
1、市面上的日志框架;JUL、JCL(Apache 基金会的)、Jboss-logging、、、、slf4j....
日志门面(日志抽象层) | 日志实现 |
JCL(Jakarta Commons Logging-属于Apache基金会) jboss-logging | JUL(java.util.logging-Java JDK自带的) |
SLF4j(Simple Logging Facade for Java) | Log4j 、Log4j2、 Logback |
2、其中 SLF4j 与 Log4j 、 出自同一人之手,Logback 是 的升级版;而 和 Log4j 都是 Apache 的,前者表示 2.x 版本,后者表示 1.x 版本,因为两者差异较大,所以才区别对待。
3、SpringBoot 底层是 Spring 框架,而 Spring 框架默认是用 JCL,但是 SpringBoot 选用的是 SLF4j 和 logback,所以Spring Boot 的日志框架重点是学习使用 SLF4j 和 logback
4、所以为了开发日志系统扩展性更好的应用,就得从上表中左右两边各选择一个进行日志接口和实现进行开发,而且编码的时候应该调用左边的接口,而不是右边的实现,这样利于将来扩展。
slf4j 日志框架概述
1、SLF4J Github 开源地址:
2、官网地址:,官网有非常详细的使用文档以及 Jar 包下载和配置等
3、开发的时候,为了应用日志系统的将来的扩展,日志记录方法的调用,不应该直接调用日志的实现类,而是调用日志抽象层里面的方法;这样以后即使更换了实现类也没有关系。官方 例子代码如下:
import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class HelloWorld { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(HelloWorld.class); logger.info("Hello World"); }}
4、每一个日志的实现框架都有自己的配置文件,使用 slf4j 日志门面以后,配置文件还是要用日志实现框架自己本身的配置文件,如果使用的是 logback 实现,同理也要用 logback 的配置文件。
1、第一列“SLF4J unbound”:意思是如果应用中只导入“slf4j-api.jar日志门面”,没有导入slf4j实现时,则所有调用日志记录的方法都会无效,即不会有记录.
2、第二列“SLF4J bound to logback-classic”:意思是如果导入了“slf4j-api.jar日志门面”及实现“logback-classic”的jar包,则调用SLF4J之后底层会以logback进行记录. 3、第三列“SLF4J bound to log4j”:意思是导入了“slf4j-api.jar日志门面”及实现“log4j.jar”包之后,中间还要导入一个适配包“slf4j-log412.jar”,所以当应用中调用SLF4J记录日志的时候,会先经过适配包,最后调用实现包. 4、因为 log4j 使用的时间很久了,之前并没有考虑到后来的星星之火 slf4j 可以燎原,所以导致现在使用时需要借助适配包。而 logback 本身就是专门为 slf4 写的实现包,所以不需要任何适配 。后面的 JUL 也是同理,不再累述。
slf4j + log4j 1.X 日志组合
1、在应用中的 pom.xml 中导入依赖,可以从官网获取,也可以从 maven 中央仓库获取。jar 包下载。
org.slf4j slf4j-api 1.7.25 org.slf4j slf4j-log4j12 1.7.25
log4j12 是 log4j 的适配包,因为 log4j 1.x 版本没有直接实现 slf4j,所以只能在中间适配一层。即程序员面向 slf4j 接口编程,然后它内部先调用适配包,最后适配包调用 log4j。
2、log4j 配置文件名称约定为 log4j.properties,放在类路径下即可:
#指定输出日志信息的级别与输出的位置#日志级别,包括 TRACE < DEBUG < INFO < WARN < ERROR . #console 表示下面的控制台,logFile 表示下面的日志文件.log4j.rootLogger=DEBUG,console,logFile#表示Logger不会在父Logger的appender里输出,默认为truelog4j.additivity.org.apache=true#控制台log4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.appender.console.ImmediateFlush=truelog4j.appender.console.Target=System.err#日志输出的格式log4j.appender.console.layout.ConversionPattern=%5p [%t] (%c:%L) %d{yyyy-MM-dd HH:mm:ss,SSS} ---- %m%n#日志文件log4j.appender.logFile=org.apache.log4j.FileAppenderlog4j.appender.logFile.Threshold=DEBUGlog4j.appender.logFile.ImmediateFlush=truelog4j.appender.logFile.Append=true#日志文件存放的路径log4j.appender.logFile.File=E:/logs_wmx/log.log4jlog4j.appender.logFile.layout=org.apache.log4j.PatternLayout#日志输出的格式log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
占位符日志记录
1、官网手册中 (典型使用模式)”中介绍了使用占位符的方式,如下所示:
logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
2、其中的 “{}” 就是占位符
import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class Slf4jTest { //使用日志工厂创建日志处理器 private static final Logger logger = LoggerFactory.getLogger(Slf4jTest.class); public static void main(String[] args) { //占位符方式记录日志,后面的参数会动态的填充到占位符的位置 logger.debug("Temperature set to {} Old temperature was{}", "huaAn", 9527); new Slf4jTest().showAddress("ShenZheng"); } public void showAddress(String address) { //占位符方式记录日志,后面的参数会动态的填充到占位符的位置 logger.info("address is {},is very good", address); }}
日志框架统一转为 slf4j
1、有时一个项目比较大时,里面导入了很多库或者框架,它们自身也在记录日志,使用了各种五花八门的日志框架,假如 Spring 使用了 JCL、Hibernate 使用了 jboss-logging、MyBatis 又使用了其它的 xxxx等。
2、slf4j 官方提供了解决方案:
3、根据官方提供的上图所示,解决思想是:
1、将系统中其它日志框架删除掉;
2、用中间包来替换原有的日志框架; 3、导入 slf4j 的其他实现
转载地址:https://wangmaoxiong.blog.csdn.net/article/details/81042373 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!