【发布时间】:2018-01-19 15:15:32
【问题描述】:
我正在尝试将使用 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() 调用设置的配置。
这是我的代码的 sn-p;
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 文件来配置日志记录来找到快速解决方案
-
this question 的解决方案对您的情况有帮助吗?
-
我需要通过 PropertyConfigurator.configure() 调用实用地配置日志记录。众所周知,这适用于纯 log4J,并且当我直接使用 log4j 时仍然有效。所以不是 log4J 配置。
-
那个解决方案基本上就是我正在做的......
标签: java maven logging log4j slf4j