2017-08-31 75 views
0

我的整个系统由slf4jlog4j实现记录。
我有一个问题,当一个新的模块使用logback-classic depression日志记录,因为它打破它不能从pom.xml文件排除。Logback到log4j桥

首先,我试图寻找解决方案在这第三方偏差,但找不到任何解决方案,所以我想也许他们之间的桥梁可以解决它的东西。

我主要是寻找是依赖的deafult控制台记录之间的分裂我的日志我自己log4j.xml记录仪和追加程序,所以我可以用separetly ..

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

谢谢!

回答

0

你说:

我有一个问题,当一个新的模块使用的logback经典depdency的记录不能从pom.xml文件,因为它打破它被排除在外。

这是假设还是您尝试过?另外,如果您确实尝试过,那么您是否也删除了logback-core依赖项?删除这些依赖关系的唯一方法是会破坏模块,因为logback本身实现了slf4j API,所以模块依赖于日志实现。如果模块确实依赖于实现而不是API /接口,我不认为如果不移除这些依赖关系(更改模块源代码)或编写模块依赖的某些实现类的stubbed版本。

当我编写遵循logback manual中的模式的代码时,只要我没有在logback实现类中引入依赖关系,就可以将实现从logback切换到log4j2,而不会有任何问题。

这里是我写的例子:

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 

因此,基于这一点,我想你应该,如果事情被实施了“正道”,能够与log4j2和它交换的logback罐子应该“只是工作”。

您也说:

我主要找的是我的依赖关系的deafult控制台记录日志之间的分裂,以我自己的log4j。XML记录器和追加程序,所以我可以用separetly ..

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

希望这会有所帮助!