`
com0606
  • 浏览: 60952 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dubbo的LoggerAdapter

    博客分类:
  • work
 
阅读更多

项目使用spring+dubbo+zookeeper

因为需要跟踪dubbo服务调用方ip,使用在<dubbo:service />接口上加accesslog="true"的方法来记录访问log。

但是发现在使用log4j的项目中是可以的,在使用logback的项目中却不行。access日志的记录是通过AccessLogFilter来实现的,通过debug发现在使用logback的项目中记录log时的Logger对象是Log4jLogger对象。

 

public class LoggerFactory {
    private static volatile LoggerAdapter LOGGER_ADAPTER;
    private static final ConcurrentMap<String, FailsafeLogger> LOGGERS = new ConcurrentHashMap();

    private LoggerFactory() {
    }

    public static void setLoggerAdapter(String loggerAdapter) {
        if(loggerAdapter != null && loggerAdapter.length() > 0) {
            setLoggerAdapter((LoggerAdapter)ExtensionLoader.getExtensionLoader(LoggerAdapter.class).getExtension(loggerAdapter));
        }

    }

    public static void setLoggerAdapter(LoggerAdapter loggerAdapter) {
        if(loggerAdapter != null) {
            Logger logger = loggerAdapter.getLogger(LoggerFactory.class.getName());
            logger.info("using logger: " + loggerAdapter.getClass().getName());
            LOGGER_ADAPTER = loggerAdapter;
            Iterator i$ = LOGGERS.entrySet().iterator();

            while(i$.hasNext()) {
                Entry entry = (Entry)i$.next();
                ((FailsafeLogger)entry.getValue()).setLogger(LOGGER_ADAPTER.getLogger((String)entry.getKey()));
            }
        }

    }

    public static Logger getLogger(Class<?> key) {
        FailsafeLogger logger = (FailsafeLogger)LOGGERS.get(key.getName());
        if(logger == null) {
            LOGGERS.putIfAbsent(key.getName(), new FailsafeLogger(LOGGER_ADAPTER.getLogger(key)));
            logger = (FailsafeLogger)LOGGERS.get(key.getName());
        }

        return logger;
    }

    public static Logger getLogger(String key) {
        FailsafeLogger logger = (FailsafeLogger)LOGGERS.get(key);
        if(logger == null) {
            LOGGERS.putIfAbsent(key, new FailsafeLogger(LOGGER_ADAPTER.getLogger(key)));
            logger = (FailsafeLogger)LOGGERS.get(key);
        }

        return logger;
    }

    public static void setLevel(Level level) {
        LOGGER_ADAPTER.setLevel(level);
    }

    public static Level getLevel() {
        return LOGGER_ADAPTER.getLevel();
    }

    public static File getFile() {
        return LOGGER_ADAPTER.getFile();
    }

    static {
        String logger = System.getProperty("dubbo.application.logger");
        if("slf4j".equals(logger)) {
            setLoggerAdapter((LoggerAdapter)(new Slf4jLoggerAdapter()));
        } else if("jcl".equals(logger)) {
            setLoggerAdapter((LoggerAdapter)(new JclLoggerAdapter()));
        } else if("log4j".equals(logger)) {
            setLoggerAdapter((LoggerAdapter)(new Log4jLoggerAdapter()));
        } else if("jdk".equals(logger)) {
            setLoggerAdapter((LoggerAdapter)(new JdkLoggerAdapter()));
        } else {
            try {
                setLoggerAdapter((LoggerAdapter)(new Log4jLoggerAdapter()));
            } catch (Throwable var6) {
                try {
                    setLoggerAdapter((LoggerAdapter)(new Slf4jLoggerAdapter()));
                } catch (Throwable var5) {
                    try {
                        setLoggerAdapter((LoggerAdapter)(new JclLoggerAdapter()));
                    } catch (Throwable var4) {
                        setLoggerAdapter((LoggerAdapter)(new JdkLoggerAdapter()));
                    }
                }
            }
        }

    }
}

 

 

进一步了解dubbo的日志系统,dubbo内部的日志输出都是通过LoggerFactory来获取Logger然后进行输出。

Logger接口有JclLogger(commons.logging)、JdkLogger(java.util.logging.Logger)、Log4jLogger、Slf4jLogger几种实现。Logger对象又是通过LoggerAdapter和第三方日志框架进行对接并直接创建,于是又对应几种LoggerAdapter:JclLoggerAdapter、JDKLoggerAdapter、Log4jLoggerAdapter、SLF4JLoggerAdapter。

通过这段代码

 

static {
        String logger = System.getProperty("dubbo.application.logger");
        if("slf4j".equals(logger)) {
            setLoggerAdapter((LoggerAdapter)(new Slf4jLoggerAdapter()));
        } else if("jcl".equals(logger)) {
            setLoggerAdapter((LoggerAdapter)(new JclLoggerAdapter()));
        } else if("log4j".equals(logger)) {
            setLoggerAdapter((LoggerAdapter)(new Log4jLoggerAdapter()));
        } else if("jdk".equals(logger)) {
            setLoggerAdapter((LoggerAdapter)(new JdkLoggerAdapter()));
        } else {
            try {
                setLoggerAdapter((LoggerAdapter)(new Log4jLoggerAdapter()));
            } catch (Throwable var6) {
                try {
                    setLoggerAdapter((LoggerAdapter)(new Slf4jLoggerAdapter()));
                } catch (Throwable var5) {
                    try {
                        setLoggerAdapter((LoggerAdapter)(new JclLoggerAdapter()));
                    } catch (Throwable var4) {
                        setLoggerAdapter((LoggerAdapter)(new JdkLoggerAdapter()));
                    }
                }
            }
        }

    }

 

 

可以发现在未指定dubbo.application.logger,也就是默认情况下,dubbo会优先选用log4j,而logback是和slf4j集成的,这就说明了为何在使用logback时没有日志输出了。

解决的办法就是指定dubbo.application.logger参数为slf4j:

1、在jvm启动时添加此参数

-Ddubbo.application.logger=slf4j

 

2、在LoggerFactory被classloader加载之前通过编码方式指定

System.setProperty("dubbo.application.logger","slf4j");

 

0
0
分享到:
评论

相关推荐

    dubbo资源 dubbo-admin dubbo demo

    【标题】"dubbo资源 dubbo-admin dubbo demo" 提供的是关于Apache Dubbo的相关素材,主要包括了Dubbo-admin的管理和示例项目。Dubbo是一个高性能、轻量级的开源Java RPC框架,它提供了丰富的服务治理功能,是阿里...

    dubbo示例代码dubbo-sample

    【Dubbo 示例代码详解】 Dubbo 是阿里巴巴开源的一款高性能、轻量级的Java服务治理框架,它主要提供了RPC(远程过程调用)服务,并且包含了服务注册与发现、负载均衡、容错处理、监控等全面的服务治理功能。本示例...

    incubator-dubbo-dubbo-2.6.1

    【标题】"incubator-dubbo-dubbo-2.6.1" 是一个Apache Incubator项目Dubbo的特定版本,这里的2.6.1表示该版本是Dubbo的稳定分支之一。 【描述】提到的"incubator-dubbo-dubbo-2.6.1"表明这是Apache孵化器中的Dubbo...

    dubbo-dubbo-2.7.3.rar

    dubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo...

    dubbo admin jdk1.8

    【标题】"dubbo admin jdk1.8" 指的是使用Java开发工具包(JDK)1.8版本运行的Dubbo管理控制台。Dubbo是阿里巴巴开源的一个高性能、轻量级的服务治理框架,它提供了服务注册、服务发现、调用监控等功能。在JDK1.8...

    dubbodubbo.zip

    《Dubbo技术详解与实战应用》 Dubbo是一款由阿里巴巴开源的高性能、轻量级的服务治理框架,它致力于提供一个简单、高效的分布式服务解决方案。在Java世界里,Dubbo已经成为了微服务架构的重要组成部分,其核心特性...

    dubbo视频教程|基于Dubbo的分布式系统架构实战

    Dubbo是阿里巴巴开源的分布式服务化治理框架(微服务框架),久经阿里巴巴电商平台的大规模复杂业务的高并发考验,到目前为止Dubbo仍然是开源界中体系最完善的服务化治理框架,因此Dubbo被国内大量的的互联网公司和...

    Dubbo监控系统配置

    ### Dubbo监控系统配置详解 #### 一、Dubbo监控系统概述 Dubbo是一款高性能、轻量级的开源服务框架,旨在提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。Dubbo提供了包括服务自动注册与发现、...

    dubbo-admin包

    【标题】"dubbo-admin包"是Dubbo框架的一个重要组成部分,主要用作服务治理的管理界面。这个压缩包包含了运行Dubbo管理控制台所需的所有文件,使得开发者和运维人员可以方便地监控、管理和配置Dubbo服务。 【描述】...

    dubbo xsd的支持

    在IT行业中,Dubbo是一个非常知名的Java开源框架,主要用于实现分布式服务治理。它由阿里巴巴开发并维护,旨在提供高性能、轻量级的服务间调用方案。"dubbo.xsd"文件是Dubbo框架中用于XML配置文件解析的重要组成部分...

    尚硅谷最新dubbo视频

    本套视频从分布式系统的基本概念出发,由浅入深,讲解了RPC原理,Dubbo基本使用,Dubbo高可用场景以及Dubbo原理,涉及了分布式系统中服务注册、服务发现、负载均衡、灰度发布、集群容错、服务降级等核心概念的讲解及...

    dubbo-demo-consumer、dubbo-demo-provider、dubbo-simple-monitor

    《Dubbo实战:消费者、提供者与简单监控》 Dubbo是阿里巴巴开源的一款高性能、轻量级的服务治理框架,广泛应用于分布式系统中的服务调用。本篇将详细讲解基于dubbo-demo-consumer、dubbo-demo-provider和dubbo-...

    dubbo接口测试调试工具

    前段时间排查某问题的时候,想要快速知道某些dubbo接口(三无)的响应结果,但不想启动项目(因为这些项目不是你负责的,不会部署而且超级笨重),也不想新建一个dubbo客户端项目(占地方),也不想开telnet客户端...

    dubbo捕获自定义异常_dubbo异常捕获_dubbo异常_自定义异常_捕捉异常_

    在分布式服务框架 Dubbo 中,异常处理是必不可少的一部分。Dubbo 提供了强大的异常处理机制,使得服务提供者能够向消费者传递自定义异常,从而帮助消费者更好地理解和处理服务调用中的错误情况。本文将深入探讨如何...

    dubbo-admin-2.5.4及dubbo-monitor-2.5.3 安装及配置

    本人实际测试过,这两个包可用。...2.修改dubbo-monitor中的conf目录中的dubbo.properties dubbo.registry.address 与 dubbo-admin中的配置一样 3.到dubbo-monitor中的bin目录下运行 start.sh脚本 ok

    dubbo-dubbo-2.5.9(Dubbo-admin管理平台的安装)

    【Dubbo-dubbo-2.5.9:深入理解Dubbo-admin管理平台的安装】 Dubbo,由阿里巴巴开源,是一款高性能、轻量级的Java RPC框架,它提供了丰富的监控和服务治理功能。在分布式系统中,服务管理和监控是至关重要的部分,...

    dubbo示例+dubbo官方配置文档+dubbo培训ppt

    《Dubbo示例与官方配置解析》 Dubbo,作为阿里巴巴开源的一款高性能、轻量级的服务治理框架,已经成为Java世界中分布式服务的重要选择。本文将深入探讨“dubbo示例”、“dubbo官方配置文档”以及相关的“dubbo培训...

    dubbo监控dubbo-monitor

    【标题】:Dubbo监控——Dubbo-Monitor详解 【描述】:Dubbo-Monitor是Dubbo框架中的一个重要组成部分,它提供了对服务治理的实时监控功能。作为一个强大的微服务治理工具,Dubbo-Monitor能够帮助开发者和运维人员...

    dubbo-admin的下载

    【标题】"dubbo-admin的下载" 在分布式系统开发中,Dubbo是一个广泛使用的高性能Java RPC框架,由阿里巴巴开源。而dubbo-admin是Dubbo框架的一部分,它提供了一个管理控制台,允许开发者监控和管理服务的运行状态,...

Global site tag (gtag.js) - Google Analytics