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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:49:04