You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Log4j无法生成日志文件求助(Windows Server 2012+Tomcat环境)

问题排查:Windows Server 2012上Log4j FileAppender不生效

我在项目中使用以下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:这两个属性的前缀写错了!它们属于你定义的file Appender,正确的写法应该是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:49:13