【发布时间】:2014-11-03 16:10:59
【问题描述】:
我在运行时使用 log4j 在文本文件中记录信息。这是在tomcat/conf 文件夹中找到的log4j.properties 文件
log4j.additivity.com.ixaris.apps.genericapp.web.filter.HttpAccessFilter=false
log4j.appender.file=org.apache.log4j.rolling.RollingFileAppender
log4j.appender.file.rollingPolicy = org.apache.log4j.rolling.TimeBasedRollingPolicy
log4j.appender.file.rollingPolicy.FileNamePattern = C:/dev/generic-app/generic-app.%d{yyyy-MM-dd}.log
log4j.appender.file.layout = org.apache.log4j.EnhancedPatternLayout
log4j.appender.file.layout.ConversionPattern = %m%n
log4j.appender.file.Locking=false
此文件已正确保存到我提供的路径。但是,当创建时,该文件会立即被 tomcat 本身锁定。稍后,当tomcat仍在运行时,我正在处理此日志文件信息,我需要将此文件移动到另一个文件夹:C:/dev/generic-app/Processed
我正在使用此代码:
read = new BufferedReader(new FileReader(logFiles[i]));
//parse and upload records in file to db
parseLogFile(logFiles[i]);
//move files to processed folder
Files.move(logFiles[i].toPath(), new File(uploadedFolder.getAbsolutePath() + "\\\\" + logFiles[i].getName()).toPath(), StandardCopyOption.REPLACE_EXISTING);
在 parseLogFile 中,我确保执行 read.close() 以释放文件上的所有流。
然而这会抛出这个异常:
ERROR: Problem moving log files to Processed folder.
java.nio.file.FileSystemException: C:\dev\generic-app\generic-app.2014-11-03.log -> C:\dev\generic-app\Processed\generic-app.2014-11-03.log:
The process cannot access the file because it is being used by another process.
at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
at sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387)
at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:286)
at java.nio.file.Files.move(Files.java:1345)
at log2db.Log2DB.main(Log2DB.java:90)
我还尝试使用 System.gc() 强制垃圾收集,但也没有运气。
有什么建议么?谢谢!
【问题讨论】:
-
如果 tomcat 锁定了文件,那么你真的无能为力...
-
是的,我正在尝试在这里找到解决方法.. 我假设没有直接的解决方案.. 我不确定为什么即使我正在设置 tomcat 甚至会锁定文件锁定为假
-
为什么需要将文件复制到“已处理”?
-
因为这些日志被用于统计并且每天都被记录在不同的文件中。我需要将已经处理的日志与仍然需要评估的日志分开