首页 > 其他分享 >SLF4J 中的适配器模式

SLF4J 中的适配器模式

时间:2024-10-26 11:31:34浏览次数:3  
标签:String 适配器 模式 SLF4J void Logger public

什么是适配器模式

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

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 中有典型适配器模式,不看一看?

标签:String,适配器,模式,SLF4J,void,Logger,public
From: https://www.cnblogs.com/Higurashi-kagome/p/18503816

相关文章

  • 前端开发设计模式——工厂模式
    目录一、定义和特点1.定义2.特点二、实现方式三、使用场景1.创建复杂对象2.根据不同条件创建对象四、优点1.代码复用2.解耦对象创建和使用3.易于维护五、缺点1.增加代码复杂度2.工厂函数可能变得臃肿六、注意事项1.命名规范2.单一职责原则3.错误......
  • 工厂设计模式
    工厂设计模式工厂设计模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,工厂模式的核心是定义一个创建对象的接口,但是让实现这个接口的类来决定实例化哪一个类。工厂模式将实例化的过程延迟到子类中进行。类型:工厂设计模式有不同的变种,其中包括:简单工厂模式:由一个工厂......
  • 适配器模式
    总结自:《HeadFirst设计模式》适配器的作用是使原本两个不兼容的系统能够兼容起来,比如电源转接口就是一种适配器:假设有一个Duck(鸭子)接口,其中有quack(呱呱叫)和fly方法:publicinterfaceDuck{voidquack();voidfly();}现在如果你还没实现好Duck接口,想先......
  • 微服务设计模式-边车模式(Sidecar Pattern)
    微服务设计模式-边车模式(SidecarPattern)定义边车模式(SidecarPattern)是一种将应用程序的功能分离到一个独立的进程或容器中的设计模式。这个独立的进程或容器被称为边车(Sidecar),它与主应用程序(MainApplication)一起运行,并为其提供额外的功能和服务。边车模式可以看作是一......
  • 从门面模式到 SLF4J 及其 getLogger 方法原理
    基于以下内容总结:从门面模式到Slf4j、10分钟讲清楚JavaSLF4J,Java日志框架的扛把子,从原理到实践写后端接口的时候,先写一个Service接口,这个Service接口的实现中可能会调用多个其他Service或Mapper方法来实现某个业务,对于Controller,只需要传递参数给Service方法就......
  • 使用 NLP 和模式匹配检测、评估和编辑日志中的个人身份信息 - 第 2 部分
    作者:来自Elastic StephenBrown如何使用Elasticsearch、NLP和模式匹配检测、评估和编辑日志中的PII。简介:分布式系统中高熵日志的普遍存在大大增加了PII(PersonallyIdentifiableInformation-个人身份信息)渗入我们日志的风险,这可能导致安全和合规性问题。这篇由两......
  • 研发模式IPD的总结
    1.研发模式介绍:2.角色和指责3.需求分析4.开发串讲对应输出:5.测试策略制定(前置条件:有清晰的需求文档、设计文档和开发文档)对应输出:......
  • 实验3:工厂方法模式
    [实验任务一]:加密算法目前常用的加密算法有DES(DataEncryptionStandard)和IDEA(InternationalDataEncryptionAlgorithm)国际数据加密算法等,请用工厂方法实现加密算法系统。实验要求:1.画出对应的类图;2.提交该系统的代码,该系统务必是一个可以能够直接使用的系统,查阅资料完成相......
  • 部署 KRaft 模式下的 Kafka
    环境介绍kafka1:192.168.174.100kafka2:192.168.174.101kafka3:192.168.174.102下载kafka#wgethttps://dlcdn.apache.org/kafka/3.8.0/kafka_2.13-3.8.0.tgz解压kafka#tarxfkafka_2.13-3.8.0.tgz-C/usr/local#ln-sv/usr/local/kafka_2.13-3.8.0/usr/local......
  • 在K8S中,kube-proxy 三种工作模式和原理是什么?
    在Kubernetes(K8s)中,kube-proxy是负责实现Service的网络代理和负载均衡功能的组件。它支持三种不同的工作模式,每种模式的工作原理和特点各不相同。以下是kube-proxy的三种工作模式和原理的详细解释:1.Userspace模式工作原理:kube-proxy监听KubernetesAPI服务器中Service和Endpo......