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 的 jar 文件也正在部署
- 用户权限足以创建日志文件。在我的第一次测试中,我什至看到了正在创建的文件(但仍然是空的)。在随后的测试中,不再创建日志文件
我做错了什么?
尝试将文件路径更改为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>
我的 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 的 jar 文件也正在部署
- 用户权限足以创建日志文件。在我的第一次测试中,我什至看到了正在创建的文件(但仍然是空的)。在随后的测试中,不再创建日志文件
我做错了什么?
尝试将文件路径更改为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>