0

如果我不断地解析一个日志文件并且我检测到它已经旋转,那么处理这个问题的最佳实践是什么?

  1. 更新我的内部哈希图以反映新的文件指针(旋转文件结束)
  2. 或者我应该将哈希图更新为 0,以便它可以从一开始就读取旋转的文件

我担心的是,在情况没有异常的情况下。2,我可能从一开始就间接解析一个大文件,给主机带来很大的负载。但是,如果我不使用。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
 }
4

2 回答 2

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) {
        // ...
    }
}
于 2013-01-25T09:31:42.180 回答
0

我认为您的问题一般是如何管理日志文件。此类操作可以使用诸如 bash 之类的脚本语言或诸如 python 之类的一些通用脚本语言来完成。使用 java 的一个广泛的教程是管理 Java 子系统的日志

于 2013-01-25T09:42:15.457 回答