我尝试迁移使用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设置并正确记录。
答案 0 :(得分:1)
我通过在weblogic.xml文件中添加以下内容解决了这个问题:
<prefer-application-packages>
<package-name>org.slf4j</package-name>
</prefer-application-packages>