dubbo使用logback输出日志(jetty 启动)

2022-06-18 08:36:21

1. 背景

最近做一个dubbo 相关项目, 开发环境使用jetty 启动项目时候,

关于dubbo 的日志显示如下:



作为一个有代码洁癖的我,不能忍

我们商城使用 slf4j+logback 体系, 能否把dubbo 的日志切换到 logback 上来呢?

2. 原因

跟踪 dubbo 的日志类 com.alibaba.dubbo.common.logger.LoggerFactory

发现源码:

    // 查找常用的日志框架
    static{
        String logger = System.getProperty("dubbo.application.logger");
        if ("slf4j".equals(logger)){
            setLoggerAdapter(new Slf4jLoggerAdapter());
        }else if ("jcl".equals(logger)){
            setLoggerAdapter(new JclLoggerAdapter());
        }else if ("log4j".equals(logger)){
            setLoggerAdapter(new Log4jLoggerAdapter());
        }else if ("jdk".equals(logger)){
            setLoggerAdapter(new JdkLoggerAdapter());
        }else{
            try{
                setLoggerAdapter(new Log4jLoggerAdapter());
            }catch (Throwable e1){
                try{
                    setLoggerAdapter(new Slf4jLoggerAdapter());
                }catch (Throwable e2){
                    try{
                        setLoggerAdapter(new JclLoggerAdapter());
                    }catch (Throwable e3){
                        setLoggerAdapter(new JdkLoggerAdapter());
                    }
                }
            }
        }
    }

可以发现,  dubbo 会判断 dubbo.application.logger 环境变量参数值

写道
如果是 slf4j 会使用 Slf4jLoggerAdapter

如果是 jcl 会使用 JclLoggerAdapter

如果是 log4j 会使用 Log4jLoggerAdapter
如果是 jdk 会使用 JdkLoggerAdapter


如果没有设值, 那么会优先使用 Log4jLoggerAdapter> Slf4jLoggerAdapter> JclLoggerAdapter> JdkLoggerAdapter

哦 ,明白了 ,

由于没有设置 dubbo.application.logger 属性导致

启动的时候 ,用了com.alibaba.dubbo.common.logger.log4j.Log4jLoggerAdapter

写道
21:33:03 INFO (AbstractApplicationContext.java:583) prepareRefresh() - Refreshing Root WebApplicationContext: startup date [Tue May 15 21:33:03 CST 2018]; root of context hierarchy
21:33:03 INFO (XmlBeanDefinitionReader.java:317) loadBeanDefinitions() - Loading XML bean definitions from class path resource [spring/spring-context.xml]
21:33:03 INFO (XmlBeanDefinitionReader.java:317) loadBeanDefinitions() - Loading XML bean definitions from class path resource [spring/service-consumer.xml]
[15/05/18 09:34:26:026 CST] INFO logger.LoggerFactory: using logger: com.alibaba.dubbo.common.logger.log4j.Log4jLoggerAdapter

那么明明项目中没有使用 log4j, 为什么没有报错呢?

我们看下项目依赖



哦 epi 这里多了个log4j

排除掉他

3.解决方案

jetty

  <!-- jetty-maven-plugin -->
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>${version.jetty-maven-plugin}</version>
                <configuration>
                   ......

                 <systemProperties>
                        <systemProperty>
                            <name>dubbo.application.logger</name>
                            <value>slf4j</value>
                        </systemProperty>
                    </systemProperties>

....
                    
                </configuration>
            </plugin>

采取以下方式来切换成slf4j:

(1)设置jvm启动参数来指定slf4j(这种方式无论是spring容器还是web容器均可适用)

          -Ddubbo.application.logger=slf4j

(2)web项目,可继承ContextLoaderListener来设置

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

4. 改造完成之后输出结果



5. 参考

https://blog.csdn.net/long243416336/article/details/49946833

  • 作者:飞天奔月
  • 原文链接:https://blog.csdn.net/venusdrogon/article/details/84920609
    更新时间:2022-06-18 08:36:21