1、日志框架
使用原因:(开发一个大型系统为例)
- 之前我们习惯用 System.out.prinltln(" "),将关键数据打印在控制台上,当项目上线后,必须手动将这些输出语句去掉
- 控制台输出的数据有利于我们项目上线后排查问题,这时我们需要将这些数据存放在一个文件中
- 这个时候我们通常的做法是引入一个jar包,实现以上的需求,比如 xxxx.jar
- 使用了一段时间后,我们发现步骤3引入的jar包的功能不能满足我们的需求,假如不能实现自动归档等,这时我们需要将以前的框架卸下来,换上新的框架,重新修改之前相关的api(想想,这个工作量得多大,恐怕头发又得少不少吧哈哈)
- 这个时候我们想到了JDBC--数据库驱动
- 写一个统一的接口层,也就是我们平时说的日志门面(日志抽象层)
- 给项目导入具体的日志实现就行了,当需要换框架的时候,只需更换jar包或者maven配置,不用修改代码,这岂不是美滋滋
2.SLF4J使用
如何在系统中使用slf4j
以后开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法;
给系统里面导入slf4j的jar和logback的实现jar
蓝色框:表示的是slf4j相关的类
红色框:表示slf4j的抽象层方法
红色圆圈:一般getLogger()传入的参数为当前的类名,有利于准确定位日志信息对应的类
注意:
一般的话,不推荐第一种方法,直接调用抽象层的实现方法,没有日志输出
每一个日志的实现框架都有自己的配置文件,使用slf4j后,配置文件还是使用日志实现框架的配置文件
遗留问题
a系统(使用slf4j + logback实现框架),但a系统的搭建结合了 Spring(commons-logging)、Hibernate(jboss-logging)、Mybatis等框架,这个时候,整个系统的就像是一个日志全家桶,什么日志框架都有,这个时候我们想统一日志记录,即使别的框架也和我们一样的slf4j进行日志输出
如何让系统中的所有日志统一到slf4j
- 将系统中其他的日志框架先排除出去
- 用中间包来替换原有的日志框架
- 我们导入slf4j的jar以及其他的日志实现框
3.spring boot的日志关系
spring boot用它来做日志功能:
底层依赖关系;
总结:
- SpringBoot底层也是使用slf4j+logback的方式进行日志记录
- SpringBoot也把其他的日志都替换成了slf4j;
- 中间替换包偷梁换柱将其他日志转换为slf4j;
- 如果我们要引入其他框架,一定要把这个框架的默认日志依赖移除掉;
Spring框架用的是commons-logging,SpringBoot要排除commons-logging;
SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉即可;
四、日志使用
1、默认配置
SpringBoot默认帮我们配置好了日志,测试一下:
SpringBoot修改日志的默认配置:
在这个jar包里有SpringBoot的默认配置
2、指定配置
给类路径下放上每个日志框架自己的配置文件即可;SpringBoot就不使用他默认配置的了。
logback.xml:直接就被日志框架识别了;
logback-spring.xml(推荐):日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用SpringBoot的高级Profile功能;
如:
如果使用logback.xml作为日志配置文件,还要使用profile功能,会有以下错误:
no applicable action for [springProfile]
五、切换日志框架
可以按照slf4j的日志适配图,进行相关的切换;
面向slf4j编程,但是要用log4j实现,slf4j+log4j的方式;
或者这样做切换为log4j2: