如果日志文件已旋转怎么办?

时间:2013-01-25 09:08:20

标签: java algorithm file

如果我不断解析日志文件并发现它已经旋转,处理此问题的最佳做法是什么?

  1. 更新我的内部hashmap以反映新的filePointer(结束于 旋转文件)
  2. 或者我应该将hashmap更新为0以便它可以读取 从头开始旋转文件
  3. 我担心的是,在情况异常的情况下没有。如上所述,我可能会从一开始就间接解析一个大文件并对主机施加很大的负担。 但是,如果我不使用。 1我可能会错过一些关键的东西,我正在解析日志文件。

    这是我放在一起的代码。

    currentFilePointer = util.FileManagement.getLastFilePointerFromFile(file.getName());
    lastFilePointer = Long.parseLong(lastReadFiles_.get(file.getName()).toString());
    
    if (currentFilePointer < lastFilePointer) // file has grown
    {
         processLineByLine(file.getName(), currentFilePointer, lastFilePointer);
    } else if (currentFilePointer > lastFilePointer) // file has been rotated
    {
         lastReadFiles_.put(file.getName(), currentFilePointer); // Option 1
     }
    

2 个答案:

答案 0 :(得分:0)

从您发布的代码中,我看不到任何Hashmap ...很难说哪个解决方案更好:)

这是我用来“尾随”文件的一段代码,它也支持旋转(在一个单独的线程中运行):

@Override
public void start() {
    File file = ...
    long filePointer = 0;
    try {
        while (running) {
            Thread.sleep(updateInterval);
            long len = file.length();
            if (len < filePointer) {
                // File was rotated
                filePointer = 0;
            } else if (len > filePointer) {
                // File must have had something added to it!
                RandomAccessFile raf = new RandomAccessFile(file, "r");
                raf.seek(filePointer);

                // Here you can read the next lines using for example a BufferedReader

                filePointer = raf.getFilePointer();
                raf.close();
            }
        }
    } catch (Exception e) {
        // ...
    }
}

答案 1 :(得分:0)

我认为您的问题是如何管理日志文件。这样的操作可以使用像bash这样的脚本语言或像python这样的通用脚本语言来完成。使用java的广泛教程是managing Logs for the Java Subsystems