【问题标题】:Move file while running tomcat which is locking the file运行锁定文件的tomcat时移动文件
【发布时间】: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 甚至会锁定文件锁定为假
  • 为什么需要将文件复制到“已处理”?
  • 因为这些日志被用于统计并且每天都被记录在不同的文件中。我需要将已经处理的日志与仍然需要评估的日志分开

标签: java file tomcat log4j


【解决方案1】:

我知道这是旧的,但以防万一其他人来这里寻找答案,您可以检查 windows 的 logrotate 实现。 https://sourceforge.net/p/logrotatewin/wiki/LogRotate/

请参阅 copytruncate 选项。

我只使用了 Linux 版本,但到目前为止,它在移动 tomcat 文件方面对我来说效果很好。

【讨论】:

    猜你喜欢
    • 2012-04-24
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 2019-02-22
    相关资源
    最近更新 更多