Log4j无法生成日志文件求助(Windows Server 2012+Tomcat环境)
我在项目中使用以下log4j.properties文件配置日志,但日志始终没有在指定路径生成:
log4j.rootLogger=DEBUG,file #log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.org.apache.ibatis.MaxFileSize=15MB log4j.appender.org.apache.ibatis.MaxBackupIndex=10 log4j.appender.file.File=E:\logs\file.log log4j.appender.file.DatePattern='.'yyyy-MM-dd log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=[%p] %d %c %M - %m%n
为了定位问题,我编写了如下测试JSP:
<%@page import="org.apache.log4j.*"%> <%@page import="java.io.*"%> <%@page import="java.lang.*"%> <%@page import="java.util.*"%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <%! static Logger logger = Logger.getLogger("sample_jsp"); %> <% Enumeration e = Logger.getRootLogger().getAllAppenders(); while ( e.hasMoreElements() ){ Appender app = (Appender)e.nextElement(); out.println(app.getClass()); if ( app instanceof ConsoleAppender ){ //out.println("File: " + ((ConsoleAppender)app).getFile()); } } %> </body> </html>
测试结果发现:
- 部署在Windows Server 2012的Tomcat上时,页面仅返回
ConsoleAppender类,FileAppender完全没生效; - 但把相同代码部署在Windows Server 2008的Tomcat上时,日志能正常生成,页面也能返回配置好的FileAppender。
我已经尝试过将日志路径放在Tomcat目录内外,结果都没用,使用的Log4j版本是1.2.17。想请教下这个异常行为的原因是什么?
可能的原因分析
1. Log4j配置文件存在语法错误
看你的配置里有两处明显的错误:
log4j.appender.org.apache.ibatis.MaxFileSize=15MB和log4j.appender.org.apache.ibatis.MaxBackupIndex=10:这两个属性的前缀写错了!它们属于你定义的fileAppender,正确的写法应该是log4j.appender.file.MaxFileSize和log4j.appender.file.MaxBackupIndex。- 另外,
DatePattern属性是DailyRollingFileAppender的专属配置,你现在用的是FileAppender,这个配置完全无效,虽然不会直接导致Appender失效,但属于冗余错误。
Windows Server 2008的环境可能对这类配置错误的容错性更高,或者Log4j在旧环境下会忽略无效配置继续加载,而2012的环境下配置解析失败,导致Log4j回退到默认的ConsoleAppender。
2. 目录权限问题
Windows Server 2012的权限管控比2008更严格:
- 如果Tomcat是以系统服务的方式运行,默认的服务账户(比如
Local System)可能没有E:\logs目录的读写权限,甚至没有访问E盘的权限; - 如果
E:\logs目录不存在,Log4j在没有权限创建目录的情况下,会静默失败并切换到ConsoleAppender。
建议你手动创建E:\logs目录,然后给Tomcat运行账户分配该目录的读写权限试试。
3. 路径转义问题
Windows路径中的反斜杠\在Log4j配置中需要转义,正确的写法应该是E:\\logs\\file.log,或者直接使用正斜杠E:/logs/file.log。
虽然部分环境下单斜杠能被正确解析,但Windows Server 2012的JVM可能对路径解析更严格,导致单斜杠路径无法识别,Log4j无法创建文件,最终回退到ConsoleAppender。
4. 配置文件加载冲突
Windows Server 2012的Tomcat可能加载了其他位置的Log4j配置文件,覆盖了你项目中的配置:
- 比如Tomcat全局的
lib目录下存在另一份log4j.properties,或者项目中其他目录(如WEB-INF/classes外的路径)有优先级更高的配置文件; - 不同环境下Tomcat的类加载顺序可能有差异,导致2008环境加载了你的配置,而2012环境加载了全局配置。
你可以检查Tomcat的lib目录和其他可能存放配置的位置,看看是否有重复的Log4j配置文件。
5. JVM/Tomcat版本差异
Windows Server 2012和2008上的Tomcat或JDK版本可能不同:
- 某些Tomcat版本对Web应用的类加载机制有调整,导致Log4j无法正确加载项目中的配置文件;
- 不同JDK版本对文件系统的处理逻辑有差异,影响Log4j创建日志文件的流程。
建议你对比两台服务器上的Tomcat版本和JDK版本,排查是否存在版本兼容性问题。
内容的提问来源于stack exchange,提问作者Abhinav

