首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >登录回log4j桥

登录回log4j桥
EN

Stack Overflow用户
提问于 2017-08-31 08:17:08
回答 1查看 3K关注 0票数 0

我的整个系统都是由slf4j记录的,带有log4j实现。

当一个新模块使用logback-classic深度进行日志记录时,我遇到了问题,因为它破坏了pom.xml文件,所以不能将它排除在日志文件之外。

首先,我试图在第三面寻找解决方案,但没有找到任何解决方案,所以我想,也许在他们之间架起一座桥梁来解决这个问题。

我主要想要的是将我的日志拆分到我自己的log4j.xml记录器和追加器之间,这样我就可以使用separetly了。

是否有任何桥梁,以便我可以同时使用logback-classiclog4j在slf4j下的例子?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-09-03 05:59:46

你说过:

当一个新模块使用logback-经典的日志记录时出现了问题,因为它破坏了pom.xml文件,所以不能将它排除在日志文件之外。

这是假设还是你试过了?另外,如果您确实尝试过,您是否也删除了logback核心依赖项?消除这些依赖关系的唯一方法是,如果模块依赖于日志实现,因为logback本机实现了slf4j API。如果模块确实依赖于实现,而不是依赖于API/接口,那么我认为,如果不删除这些依赖项(更改模块源代码)或编写模块所依赖的实现类的一些简单版本,您就无能为力了。

在编写遵循登录手册模式的代码时,只要不引入对logback实现类的依赖关系,就可以将实现从logback交换到log4j2,而不会出现任何问题。

下面是我写的例子:

代码语言:javascript
复制
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中的依赖项:

代码语言:javascript
复制
    <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>

这是输出:

代码语言:javascript
复制
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 jars:

代码语言:javascript
复制
    <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>

以下是进行此更改后的输出:

代码语言:javascript
复制
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

因此,基于这一点,我认为,如果事情是以“正确的方式”实现的,那么您应该能够用log4j2交换logback jars,并且它应该“只是有效的”。

你还说:

我主要想要的是将我的日志拆分到我自己的log4j.xml记录器和追加器之间,这样我就可以使用separetly了。

现在,我完全清楚您在问什么,但我认为您希望让来自模块的日志消息转到控制台,以及您在log4j2配置中使用的任何日志。如果这种情况与修改log4j2配置一样简单--添加一个具有适当名称的记录器并分配适当的附加程序。例如,如果您的模块的类是com.my.package.Class1、com.my.package.Class2、com.my.package.Class3等,那么您可以为com.my.package创建一个记录器,并为它提供一个控制台附录以及适当的文件附加程序。

希望这能有所帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45976551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档