slf4j/log4j 未创建日志文件

slf4j/log4j log file not created

我的 Maven 项目导致 WAR 文件部署在 Tomcat

我在 pom.xml

中包含了对 slf4j-log4j 的依赖
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.21</version>
</dependency>

log4j.properties 文件看起来像这样(我已经确保它实际上部署在 war 文件中并最终在 WEB-INF/classes 中):

log4j.rootLogger = DEBUG, MyFile

# Define the file appender
log4j.appender.MyFile=org.apache.log4j.FileAppender
log4j.appender.MyFile.File=${catalina.base}/logs/MyFile.log
log4j.appender.MyFile.ImmediateFlush=true

log4j.appender.MyFile.Threshold=DEBUG

log4j.appender.MyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.MyFile.layout.ConversionPattern=%-5p [%t]: %m%n

以下代码应该 afaik 在我的 tomcat 日志文件夹中生成一个名为 MyFile.log 的日志文件,其中还包括我的日志输出......但它没有。该文件甚至没有被创建。

EDIT2:相反,我发现日志条目被写入 STDOUT 而不是 FileAppender 的日志文件...

EDIT3:我在两个不同的 Tomcat 上进行了测试(一个在 Suse Linux 上,另一个在 Windows 上作为一项服务)。结果基本一样

private Logger logger = LoggerFactory.getLogger(MyClass.class);

...

logger.info("User {} not found", cn);

编辑:

我做错了什么?

尝试将文件路径更改为log4j.appender.MyFile.File=logs/MyFile.log。由于 Tomcat 安装目录是您应用程序的当前目录,因此它必须在没有参数 ${catalina.base} 的情况下工作,而参数 ${catalina.base} 在您的应用程序上下文中可能不存在。

我设法使用以下 log4j.xml 而不是 log4j.properties 解决了问题。我不确定为什么...

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="MyFile" class="org.apache.log4j.FileAppender">
        <param name="file" value="${catalina.base}/logs/MyFile.log"/>
        <param name="Append" value="true"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{dd.MM.yyyy HH:mm:ss.SSS} [%t] %-5p %c{1}:%M - %m%n"/>
        </layout>
    </appender>

    <root>
        <priority value="info"/>
        <appender-ref ref="MyFile"/>
    </root>

</log4j:configuration>