Log4j属性与SLF4J不兼容

4

我正在尝试将一个使用log4j 1.2.6的Java应用程序迁移到使用SLF4J。首先,我只是想让它在以log4j 1.2.6为日志实现的情况下正常工作。log4j配置从数据库中加载,然后使用PropertyConfigurator.configure()进行设置。在尝试迁移到SLF4J之前,这一直很好地工作。

但是,在将日志调用转换为使用SLF4J并添加所需的pom.xml文件条目后,log4j实现似乎没有受到PropertyConfigurator.configure()调用的影响。应用程序似乎正在使用log4j记录日志,但它只会记录到控制台,而不是根据PropertyConfigurator.configure()调用的配置方式。

有趣的是,如果我使用一个log4J日志调用,那么这些日志将按照预期使用通过PropertyConfigurator.configure()设置的配置。

以下是我的代码片段:

import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
public class Initialization extends HttpServlet {
private static final Logger log = LoggerFactory.getLogger ( Initialization.class );  
private static final org.apache.log4j.Logger log4j = org.apache.log4j.Logger.getLogger(Initialization.class);
...
PropertyConfigurator.configure ( logProps );

log4j.error("This gets logged as expected based on the log4J config set by the above call.");
log.error("This gets logged to the console.");

这是我在pom.xml文件中的内容:

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency> 
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version> 
</dependency>

由于某些原因,程序设置的log4J配置并没有影响到SLF4J使用的log4J实现,或者SLF4J没有使用log4J实现。
我也尝试从文件加载log4j属性:
PropertyConfigurator.configure ( sc.getRealPath ( "/WEB-INF/properties/log4j.props" ) );

但是这样做结果一样。我也尝试在一个新的应用程序中做同样的事情,SLF4J日志语句正确使用了log4j设置并正确记录了日志。


我认为你可以通过构建一个属性文件或XML文件来配置日志,从而找到快速解决方案。 - DamCx
这个问题的解决方案是否有助于您的情况? - Stephan
我需要通过PropertyConfigurator.configure()调用来编程配置日志记录。这在纯log4J中已知可行,并且在我直接使用log4j时仍然有效。因此,这不是log4J的配置问题。 - Ryan Pries
那个解决方案基本上就是我正在做的... - Ryan Pries
1个回答

1
我通过在weblogic.xml文件中添加以下内容解决了这个问题:
<prefer-application-packages>
    <package-name>org.slf4j</package-name>
</prefer-application-packages>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接