Log4j2日志无法写入文件求助(RHEL9环境)
问题描述
我有一个内嵌log4j2.xml配置文件的应用,在本地环境及RHEL7.9(CPE OS Name: cpe:/o:redhat:enterprise_linux:7.9:GA:server)服务器上日志功能正常,但部署到RHEL9(CPE OS Name: cpe:/o:redhat:enterprise_linux:9::baseos)服务器后,日志无法写入指定路径。已排查权限问题及文件夹创建情况,未发现异常。
Log4j2.xml配置
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Properties> <Property name="base_log">/com/logs/testing/</Property> <Property name="testing_utility_log">${base_log}/testing_utility.log</Property> </Properties> <Appenders> <RollingFile name="testing_utility" fileName="${testing_utility_log}" filePattern="${testing_utility_log}_%d{dd-MM-yyyy}" ignoreExceptions="false"> <PatternLayout> <Pattern>%d{HH:mm:ss,SSS}[%t] %-5p(%F:%L) - %m%n</Pattern> </PatternLayout> <TimeBasedTriggeringPolicy/> </RollingFile> </Appenders> <Loggers> <Root level="INFO"> <AppenderRef ref="testing_utility"/> </Root> </Loggers> </Configuration>
类路径依赖Jar包
commons-codec-1.16.1.jar commons-io-2.15.1.jar commons-lang3-3.12.0.jar log4j-api-2.17.2.jar log4j-core-2.17.2.jar log4j-jul-2.17.2.jar log4j-slf4j-impl-2.17.2.jar slf4j-api-1.7.31.jar
日志相关代码实现
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; private static final Logger LOGGER = LogManager.getLogger(Testing.class); LOGGER.info("[Starting Testing for {} ] ", fileName);
本地日志输出示例
09:52:33,349[main] INFO (Testing.java:39) - [Starting Testing for TEST45678 ]
排查与解决方向
检查SELinux状态
RHEL9默认SELinux为强制模式,即便文件夹权限正常,也可能阻止应用写入路径。执行sestatus查看状态,若为Enforcing,可临时切换为Permissive模式测试:setenforce 0。如果日志恢复正常,说明是SELinux策略限制,可添加永久规则:semanage fcontext -a -t httpd_sys_rw_content_t "/com/logs/testing(/.*)?" restorecon -Rv /com/logs/testing(根据应用类型调整上下文,普通Java应用可使用
java_home_t)核对JDK版本
RHEL9默认OpenJDK版本与RHEL7.9存在差异,部分版本的文件系统访问逻辑有变化。确认应用使用的JDK版本是否一致,不一致则切换到RHEL7.9同款JDK测试。调整Log4j2路径配置
尝试移除路径末尾斜杠,将base_log改为/com/logs/testing,避免路径解析时出现异常。开启Log4j2调试日志
启动应用时添加JVM参数-Dlog4j2.debug=true,查看初始化过程中的详细日志,定位配置加载、文件访问的具体错误。检查文件系统挂载属性
执行mount命令查看/com/logs/testing所在分区的挂载参数,确认是否存在noexec、nodev等限制写入的属性。
内容的提问来源于stack exchange,提问作者Chennai Cheetah

