Log4j生成.nfsXXXX文件而非.log日志文件的原因及解决方法咨询
Log4j生成.nfsXXXX格式日志文件的原因及解决方法
问题描述
我在Linux环境下使用Log4j生成日志文件时遇到了一个奇怪的问题:明明配置里指定了Error.log、Console.log这类日志文件名,但实际生成的却是.nfsXXXX格式的文件,所有日志内容都输出到这些临时文件里了。想请教下各位大佬,这类文件产生的原因是什么,有没有办法预防?
附上我的logging.properties配置:
log4j.logger.errorLogger=debug, E log4j.additivity.errorLogger=false log4j.appender.E=org.apache.log4j.RollingFileAppender log4j.appender.E.File=Error.log log4j.appender.E.MaxBackupIndex=10 log4j.appender.E.MaxFileSize=10MB log4j.appender.E.layout=org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern=[%d{dd MMM yyyy HH:mm:ss,SSS} : %-5p] - %m%n%n log4j.logger.consoleLogger=debug, C log4j.additivity.consoleLogger=false log4j.appender.C=org.apache.log4j.RollingFileAppender log4j.appender.C.File=Console.log log4j.appender.C.MaxBackupIndex=10 log4j.appender.C.MaxFileSize=10MB log4j.appender.C.layout=org.apache.log4j.PatternLayout log4j.appender.C.layout.ConversionPattern=[%d{dd MMM yyyy HH:mm:ss,SSS} : %-5p] - %m%n%n log4j.logger.transactionLogger=debug, T log4j.additivity.transactionLogger=false log4j.appender.T=org.apache.log4j.RollingFileAppender log4j.appender.T.File=Transaction.log log4j.appender.T.MaxBackupIndex=20 log4j.appender.T.MaxFileSize=10MB log4j.appender.T.layout=org.apache.log4j.PatternLayout log4j.appender.T.layout.ConversionPattern=[%d{dd MMM yyyy HH:mm:ss,SSS} : %-5p] - %m%n log4j.logger.XMLLogger=debug, X log4j.additivity.XMLLogger=false log4j.appender.X=org.apache.log4j.RollingFileAppender log4j.appender.X.File=XML.log log4j.appender.X.MaxBackupIndex=10 log4j.appender.X.MaxFileSize=10MB log4j.appender.X.layout=org.apache.log4j.PatternLayout log4j.appender.X.layout.ConversionPattern=[%d{dd MMM yyyy HH:mm:ss,SSS} : %-5p] - %m%n%n
原因分析
.nfsXXXX是**NFS(网络文件系统)**环境特有的临时文件,出现这种情况本质是文件句柄的问题:
- 你的Java应用还持有某个日志文件的读写句柄,但这个文件已经被外部操作(比如手动删除、定时清理脚本)删掉了。在NFS挂载的目录中,系统会创建
.nfsXXXX临时文件来保留被删文件的内容,直到持有句柄的进程关闭它。 - Log4j的
RollingFileAppender在执行日志滚动时,如果原文件被意外删除,也会导致Log4j继续往这个已被删除的文件句柄写入,进而触发NFS生成临时文件。
解决&预防方案
针对这个问题,咱们可以从几个方面入手:
- 禁止手动删除正在写入的日志文件:如果需要清理日志,要么等Log4j自动完成滚动归档,要么先停止应用再操作。如果要用自动化清理工具,推荐用
logrotate并配置copytruncate选项——它会先复制日志文件内容再清空原文件,不会直接删除文件,这样应用的文件句柄不会失效。 - 优化Log4j配置:
- 给日志文件指定绝对路径,比如把
log4j.appender.E.File=Error.log改成log4j.appender.E.File=/var/log/your-app/Error.log,避免应用运行目录变化导致文件路径异常。 - 确保日志目录有应用进程的读写权限,权限不足也可能引发文件操作异常。
- 给日志文件指定绝对路径,比如把
- 重启应用修复现有问题:如果已经出现了
.nfsXXXX文件,先重启你的Java应用,让Log4j重新创建正常的日志文件,之后就可以安全删除那些临时文件了(重启后应用会释放旧的文件句柄)。 - 检查NFS挂载状态:偶尔NFS挂载不稳定也可能导致这类异常,可以尝试重新挂载目录,或者联系运维确认NFS服务器的运行状态。
内容的提问来源于stack exchange,提问作者Dhiraj Navale
相关产品推荐
相关产品推荐

