日志门面
门面就是 一间房子里面很多东西,跟每个东西打交道太麻烦,于是设立一个 保安来看守 充当门面角色, 此时跟里面东西打交道只需跟门面打交道,但是门面要提供调用 里面东西所暴露的方法
面向接口开发,不在依赖具体的实现类,减少代码的耦合
项目通过导入不同的日志实现类来灵活切换日志框架
统一api,方便开发者学习和使用
统一配置便于项目日志管理
JCL
apache已经放弃维护
jakarta Commons Logging是apache提供的一个通用日志api
他是为所有的java日志实现 提供一个统一的接口,它自身也提供一个日志实现,但是很弱(SimpleLog)
JCL有两个抽象类 ,Log和LogFactory(负责创建log对象)
应用–》jcl–》(log4j,jul,logback)
pom.xml
1 |
|
Log
1 | /* |
获取
1 |
|
LogFactory
1 | /* |
获取
1 | public static LogFactory getFactory() throws LogConfigurationException { |
使用
1 | import org.apache.commons.logging.Log; |
日志门面 :对于特定的日志框架配置还是 指定日志框架的样子,只是获取日志对象方式使用通用的一套
Slf4j
log4j , jcl , slf4j ,logback log4j2 这里是由程序员之间的关系的,有兴趣可以了解
这个门面于logback一起诞生
简单的日志门面(simple logging facade for java)主要给java日志访问提供一套标准接口,具体有其他日志框架实现
提供 日志框架的绑定和日志框架的桥接
请注意,启用SLF4J的库意味着仅添加一个强制性依赖项,即slf4j-api.jar。如果在类路径上未找到绑定,则SLF4J将默认为无操作实现。
pom.xml
1 |
|
LoggerFactory
1 |
|
LoggerFactoryBinder
1 |
|
ILoggerFactory
1 | /* |
工厂获取
1 | //未初始化 |
Logger
1 | /* |
logger获取
1 |
|
日志记录
1 | 很简单就是根据配置文件设置是否需要进行字符串拼接,最后打印 |
绑定日志的实现(Bingding)
如前所诉,slf4j支持各种日志框架
slf4j发行般附加了几个称为 slf4j绑定 的文件,每个绑定对应一个受支持的框架
使用slf4j的绑定流程:
1 添加slf4j-api的依赖
2 使用slf4j的api在项目中进行统一的日志记录
3 绑定具体的日志实现框架
1绑定已经实现了slf4j的日志框架,直接添加对应依赖
2绑定没有实现slf4j的日志框架,先添加日志的适配器,在添加实现类依赖
4slf4j有且仅有一个日志框架实现的绑定(出现多个则默认使用第一个依赖日志实现)
绑定logback
pom.xml
1 | <dependency> |
代码
1 | jar:file:/F:/maven/repository/org/slf4j/slf4j-simple/1.7.21/slf4j-simple-1.7.21.jar!/org/slf4j/impl/StaticLoggerBinder.class |
绑定 Nop
他是一个日志开关,绑定它之后,slf4j不会输出任何日志
pom.xml
1 |
|
以上的两种遵循了 slf4j的规范,所以直接导入依赖即可
绑定 log4j
因为log4j没有遵从slf4j的日志规范, 所以需要一个 适配器来桥接
pom.xml
1 | <dependency> |
代码
1 | public class StaticLoggerBinder implements LoggerFactoryBinder |
绑定jul
与log4j一样,需要适配
pom.xml
1 |
|
代码
1 |
|
桥接
log4j的桥接
pom.xml
1 |
|
代码
桥接是什么,就是把按照包名 加 类名然后重写一遍
那么此时 适配和桥接不能放一起,因为此时真正的log4j的logger不存在,只有一个假的在这里
那么slf4j通过 StaticLoggerBinder的对象获取 的logger还是那个假的,假的调用又会走到 获取slf4j的调用,一直反复,此时栈溢出
1 | public static Logger getLogger(String name) { |
- 本文作者: 忘忧症
- 本文链接: https://NepenthesZGW.github.io/2020/03/10/framework/log/日志门面/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!