Tomcat 9运行Java Servlet时Log4j2无法生成日志文件求助
问题根因&修复步骤
1. 最常见原因:目录权限不足
Ubuntu 20.04 官方源安装的 Tomcat 9 默认以 tomcat 系统用户身份运行,你配置的日志输出目录 /home/myuser/myfolder/ 属于普通用户个人目录,tomcat 用户默认没有该目录的读写权限,因此无法生成日志文件。
两种修复方案选其一即可:
- 方案一:修改日志输出路径到Tomcat有权限的目录,把
log4j2.xml中的logdir属性值改为/var/log/tomcat9,该目录是Tomcat默认的日志目录,tomcat用户天然有读写权限。 - 方案二:给目标目录开放权限,执行以下命令:
# 给日志目录赋予tomcat用户所有权 sudo chown tomcat:tomcat /home/myuser/myfolder/ # 给上层用户目录开放执行权限,确保tomcat用户可以进入路径 sudo chmod o+x /home/myuser/
2. 优化配置加载逻辑
你当前把log4j2.xml放在src/main/webapp/WEB-INF/classes下不符合Maven项目规范,建议将配置文件挪到src/main/resources目录下,Maven执行打包时会自动将该目录下的所有文件输出到WEB-INF/classes中,避免手动放置的路径问题。
同时可以把log4j2.xml中<Configuration status="info">的status属性改为debug,Log4j2初始化阶段的调试日志会输出到Catalina日志中,方便你排查配置加载异常。
3. 显式配置Log4j2初始化监听器
虽然Servlet 3.0+理论上支持自动扫描加载Log4j2,但部分Tomcat版本存在自动扫描失效的问题,可以在web.xml中显式添加初始化配置:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>My App</display-name> <!-- 新增Log4j2配置开始 --> <context-param> <param-name>log4jConfiguration</param-name> <param-value>classpath:log4j2.xml</param-value> </context-param> <listener> <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class> </listener> <!-- 新增Log4j2配置结束 --> </web-app>
4. 验证部署
修改完成后执行以下步骤重新部署,避免Tomcat缓存旧代码:
- 执行
mvn clean package重新生成war包 - 停止Tomcat服务:
sudo service tomcat9 stop - 删除webapps下旧的
servlet-tutorial目录和servlet-tutorial.war包 - 将新生成的war包拷贝到
/var/lib/tomcat9/webapps/目录 - 启动Tomcat服务:
sudo service tomcat9 start
内容的提问来源于stack exchange,提问作者Sanlok Lee
相关产品推荐
相关产品推荐

