回到log4j桥

时间:2017-08-31 08:17:09

标签: log4j logback slf4j log4j2

我的整个系统由slf4j执行,log4j实施 当一个新模块使用logback-classic depdency进行日志记录时,我遇到了一个问题,该文件无法从pom.xml文件中排除,因为它会破坏它。

首先,我试图在第三方面倾向寻找解决方案,但无法找到任何解决方案,所以我认为它们之间的桥梁可能会解决它。

我主要想要的是将依赖的deafult控制台日志记录分配给我自己的log4j.xml记录器和appender,这样我就可以使用它了。

是否有任何桥梁,以便我可以在slf4j下使用logback-classiclog4j作为示例?

谢谢!

1 个答案:

答案 0 :(得分:2)

你说:

  

当一个新模块使用logback-classic depdency进行日志记录时,我遇到了一个问题,因为它破坏了pom.xml文件,因此无法从pom.xml文件中排除。

这是假设还是你尝试过?另外,如果您尝试过,那么您是否也删除了logback-core依赖项?删除这些依赖项的唯一方法是打破模块,如果模块依赖于日志记录实现,因为logback本机实现了slf4j API。如果模块确实依赖于实现而不是API /接口,那么我不会认为在没有删除这些依赖项(更改模块源代码)或编写实现的某些存根版本的情况下可以执行任何操作模块所依赖的类。

当我编写遵循logback manual模式的代码时,我能够将实现从logback交换到log4j2而不会出现任何问题,只要我不介绍对logback实现的依赖关系类。

以下是我写的例子:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {

    private Logger log = LoggerFactory.getLogger(Main.class);

    public static void main(String[] args) {

        Main main = new Main();
        main.main();
    }

    public void main(){
        log.trace("trace msg");
        log.debug("debug msg");
        log.info("info msg");
        log.warn("warn msg");
        log.error("Error msg");

        log.info(log.getClass().getName());
    }
}

以下是pom中的依赖项:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.22</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.2.3</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>

这是输出:

00:48:26.378 [main] DEBUG blah.Main - debug msg
00:48:26.380 [main] INFO blah.Main - info msg
00:48:26.380 [main] WARN blah.Main - warn msg
00:48:26.380 [main] ERROR blah.Main - Error msg
00:48:26.380 [main] INFO blah.Main - ch.qos.logback.classic.Logger

现在我更改pom以使用log4j2替换logback jar:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.22</version>
    </dependency>

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.7</version>
    </dependency>

进行此更改后的输出:

2017-09-03 00:52:21,630 INFO b.Main [main] info msg
2017-09-03 00:52:21,631 WARN b.Main [main] warn msg
2017-09-03 00:52:21,631 ERROR b.Main [main] Error msg
2017-09-03 00:52:21,632 INFO b.Main [main] org.apache.logging.slf4j.Log4jLogger

基于此,我认为你应该,如果事情已经实施了#14;正确的方式&#34;,能够将logback jars与log4j2交换,它应该&#34;只是工作&#34;。

你也说过:

  

我主要想要的是在依赖的deafult控制台日志记录和我自己的log4j.xml记录器和appender之间拆分日志,以便我可以使用separetly ..

现在我完全清楚你在问什么,但我想你想从模块发送日志消息到控制台以及你使用log4j2配置的任何日志。如果这种情况与修改log4j2配置一样简单 - 添加具有适当名称的记录器并分配适当的appender。例如,如果您的模块的类是com.my.package.Class1,com.my.package.Class2,com.my.package.Class3等,那么您可以为com.my.package创建一个记录器并给出它是一个控制台appender以及相应的文件追加器。

希望这有帮助!