我在运行时使用log4j在文本文件中记录信息。这是log4j.properties
文件夹
tomcat/conf
文件
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()
强制垃圾收集,但也没有运气。
有什么建议?谢谢!
答案 0 :(得分:0)
我知道这是旧的,但是为了防止其他人来这里寻找答案,你可以检查一下windows的logrotate实现。 https://sourceforge.net/p/logrotatewin/wiki/LogRotate/
请参阅copytruncate选项。
我只使用过Linux版本,但到目前为止,我一直在为移动tomcat文件工作正常。