SLF4J 中的适配器模式

什么是适配器模式

适配器模式中,适配器包装不兼容指定接口的对象,来实现不同兼容指定接口。

SLF4J 中的适配器模式

SLF4J 是一个日志门面系统,其中提供了统一的 Logger 等接口,许多框架都会面向 SLF4J 打印日志,这样就不会和具体的日志框架耦合在一起,框架使用者也就能够很方便地在不同日志实现之间切换。

SLF4J 出现之前,已经有 Log4j 等日志框架了,其本身有一套 Logger 之类的接口,为实现和 SLF4J 兼容,就引入了对应适配器层 slf4j-log4j12。

首先看一下 SLF4J 中的 Logger 接口:

public interface Logger {String getName();void debug(String msg);void info(String msg);void warn(String msg);void error(String msg);// ...省略其他方法
}

而待适配的 Log4j 的 Logger 部分源码如下:

public class Logger extends Category {protected Logger(String name) {super(name);}public static Logger getLogger(String name) {return LogManager.getLogger(name);}public static Logger getLogger(Class clazz) {return LogManager.getLogger(clazz.getName());}public static Logger getRootLogger() {return LogManager.getRootLogger();}public static Logger getLogger(String name, LoggerFactory factory) {return LogManager.getLogger(name, factory);}public void trace(Object message) {if (!this.repository.isDisabled(5000)) {if (Level.TRACE.isGreaterOrEqual(this.getEffectiveLevel())) {this.forcedLog(FQCN, Level.TRACE, message, (Throwable)null);}}}// ...省略部分方法
}

其继承的 Category 类中有 debug、info 等方法。其核心方法为 log:

public void log(String callerFQCN, Priority level, Object message, Throwable t) {if(repository.isDisabled(level.level)) {return;}if(level.isGreaterOrEqual(this.getEffectiveLevel())) {forcedLog(callerFQCN, level, message, t);}
}

下面再看适配器类 Log4jLoggerAdapter,它先是继承了 MarkerIgnoringBase,MarkerIgnoringBase 实现了 Logger,等于说 Log4jLoggerAdapter 实现了 Logger:

public final class Log4jLoggerAdapter extends MarkerIgnoringBase implements LocationAwareLogger, Serializable {private static final long serialVersionUID = 6182834493563598289L;final transient org.apache.log4j.Logger logger;Log4jLoggerAdapter(org.apache.log4j.Logger logger) {this.logger = logger;this.name = logger.getName();traceCapable = isTraceCapable();}public void debug(String msg) {logger.log(FQCN, Level.DEBUG, msg, null);}public void info(String msg) {logger.log(FQCN, Level.INFO, msg, null);}// ...省略部分方法
}

Log4jLoggerAdapter 的构造方法接收 org.apache.log4j.Logger 类型的对象,其 debug 等方法的实现中,将具体的打印工作委托给 Log4j Logger。

如果 Log4j 和 SLF4J 正常整合,则 SLF4J 的 LoggerFactory.getLogger 方法最终会返回 Log4jLoggerAdapter 的实例,从而使 Log4j 和 SLF4J 兼容。

下面是类图:

img

参考:slf4j 中有典型适配器模式,不看一看?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/822276.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pbootcms留言“提交成功”的提示语怎么修改

要在 PbootCMS 中修改留言“提交成功”的提示语,可以按照以下步骤操作:定位文件:打开 apps/home/controller/MessageController.php 文件。查找代码段:在文件中找到大约第 103 行的代码段,该段代码如下:if ($this->model->addMessage($data)) {session(lastsub, ti…

Protues中51单片机按键无法复位(已解决)

前言 昨晚用 Protues 搭建了 51 的最小系统电路,在实物中好用的复位电路,到仿真里不能正常复位了。 51 单片机是高电平复位,所以在运行时 RST 引脚应该是低电平,但在仿真中 RST 引脚一直保持高电平,导致按下按键也不能复位单片机。解决方法 我在网上搜索的解决方法一共有两…

南昌航空大学-22207316-涂高杰-JAVA第一次blog作业

一.前言 本学期新增JAVA的面向程序设计课程,为增加学生编写能力开始了本学期的PTA作业,以及接下来我将根据我的实际情况总结前三次PTA题目集中最后一题并讲诉自己对Java的学习心得。从这三次PTA作业中学习到的了对ArrayLis、Vector等自动增长的数组的使用方法,学习到了许多Ja…

安装网站出现404 not found如何解决?

遇到404 Not Found错误时,可以尝试以下几个步骤来解决问题:检查URL:确认输入的网址是否正确,包括大小写和拼写。 检查是否有遗漏或多余的字符。清除浏览器缓存:有时候旧的缓存数据会导致页面加载错误,清除缓存后重新尝试访问。刷新页面:使用F5键或点击浏览器的刷新按钮重…

pbootcms模板上线推广百度竞价后打不开网站出现404错误

PbootCMS V3.2.5 版本中为了增强安全性或优化URL结构,加入了对URL参数的严格判断。当URL中包含?但不符合特定条件(如/?tag=、/?page=、/?ext_)时,系统会自动返回404错误页面。这种做法虽然有助于防止一些非法请求,但也可能导致合法的请求被误判为无效,特别是对于那些…

分布式数据库TDSQL搭建

TDSQL介绍TDSQL是腾讯基于MySQL/Mariadb社区版本打造的一款金融级分布式数据库集群方案,目前腾讯主推TDSQL MySQL版。TDSQL MySQL版具备强一致高可用、全球部署架构、分布式水平扩展、高性能、企业级安全等特性,同时提供智能 DBA、自动化运营、监控告警等配套设施,为客户提供…

BUUCTF_BUU SQL COURSE 1

BUUCTF_BUU SQL COURSE 1 打开实例发现“热点”及“登录”两个选项 根据题目提示,sql注入,尝试在登录界面寻找注入点,无果 接着进入热点界面,发现三篇新闻,依次点击发现url变化,burp抓包发现是通过对id值的控制访问不同界面,由此发现注入点 1.判断注入类型,输入1,2-1 ?…

openGussDb企业版5.0.1搭建

openGussDb企业版5.0.1搭建官方文档地址:https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/ReleaseNotes/Releasenotes.html软件包&客户端下载地址:https://opengauss.org/zh/download/环境准备1、软件环境要求软件类型配置描述linux操作系统ARM:openEuler 20.03L…

USB协议详解第20讲(USB包-帧首包SOF)

1.包的四种类型 根据包的组成把包分为四种类型,分别是、帧首包SOF(Start of Frame)、命令包(Token)、数据包(Data)、握手包(Handshake),如下图(大家一定要把PID类型和包类型分开)。4种PID类型和4种包类型(按照组成分类)的区别如下,大家注意区分。2.SOF包组成 我…

BigDecimal使用

常见方法 我们在使用 BigDecimal 时,为了防止精度丢失,推荐使用它的BigDecimal(String val)构造方法或者 BigDecimal.valueOf(double val) 静态方法来创建对象。 《阿里巴巴 Java 开发手册》对这部分内容也有提到,如下图所示。加减乘除 add 方法用于将两个 BigDecimal 对象相…