0

ログ ファイルを継続的に解析していて、ローテーションが発生したことを検出した場合、これを処理するためのベスト プラクティスは何ですか?

  1. 新しい filePointer (ローテーションされたファイルの終わり) を反映するように内部ハッシュマップを更新します
  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

あなたの問題は、一般的なログファイルの管理方法だと思います。このような操作は、bashなどのスクリプト言語またはpythonなどの一般的なスクリプト言語を使用して実行できます。Javaを使用するための広範なチュートリアルは、Javaサブシステムのログの管理です。

于 2013-01-25T09:42:15.457 に答える
0

あなたが投稿したコードから、ハッシュマップが見えません...どちらのソリューションが優れているかわかりません:)

ファイルを「テール」するために使用したコードのスニペットを次に示します。これは、ローテーションもサポートしています (別のスレッドで実行されます)。

@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 に答える