3

私のコードを以下に示します。

public static void main(String[] args) {
    // TODO code application logic here
    File pcounter_log = new File("c:\development\temp\test.log");

try {

    Tailer tailer = new Tailer(pcounter_log, new FileListener("c:\development\temp\test.log",getLogPattern()), 5000,true);

    Thread thread = new Thread(tailer);
    thread.start();
} catch (Exception e) {
    System.out.println(e);
}
}

public class FileListener extends TailerListenerAdapter {


 public void handle(String line) {
        for (String logPattern : pattern) {
            if (line.contains(logPattern)) {
                logger.info(line);

            }
        }
    }
}

ここでは、 [info,error,abc.catch,warning] のような値をgetLogPattern()返します。ArrayListこのコードを実行すると、古いログ メッセージに続いて新しいログ メッセージが表示されます。つまり、出力は次のようになります。

20 May 2011 07:06:02,305  INFO FileListener:? - 20 May 2011 07:06:01,230 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:06:55,052  INFO FileListener:? - 20 May 2011 07:06:55,016 DEBUG  - readScriptErrorStream()
20 May 2011 07:06:56,056  INFO FileListener:? - 20 May 2011 07:06:55,040 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:07:01,241  INFO FileListener:? - 20 May 2011 07:07:01,219 DEBUG  - readScriptErrorStream()
20 May 2011 07:07:02,245  INFO FileListener:? -  20 May 2011 07:07:01,230 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:07:55,020  INFO FileListener:? -  20 May 2011 07:07:55,016 DEBUG  - readScriptErrorStream()
20 May 2011 07:07:56,024  INFO FileListener:? - 20  2011 07:07:55,030 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:08:01,269  INFO FileListener:? -  20 May 2011 07:08:01,227 DEBUG - readScriptErrorStream()
20 May 2011 07:08:02,273  INFO FileListener:? -  20 May 2011 07:08:01,230 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:08:21,234  INFO FileListener:? -  20 May 2011 06:40:02,461 DEBUG  - readScriptErrorStream()
20 May 2011 07:08:22,237  INFO FileListener:? -  20 May 2011 06:40:02,468 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:08:23,242  INFO FileListener:? -  20 May 2011 06:41:01,224 DEBUG - readScriptErrorStream()
20 May 2011 07:08:24,250  INFO FileListener:? -  20 May 2011 06:41:01,232 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:08:25,261  INFO FileListener:? -  20 May 2011 06:42:01,218 DEBUG  - readScriptErrorStream()
20 May 2011 07:08:26,265  INFO FileListener:? -  20 May 2011 06:42:01,230 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:08:27,272  INFO FileListener:? -  20 May 2011 06:43:01,223 DEBUG  - readScriptErrorStream()
20 May 2011 07:08:28,275  INFO FileListener:? -  20 May 2011 06:43:01,231 DEBUG   - exiting readScriptErrorStream()

このようなログ ファイルから古いログ メッセージを取得しないようにするにはどうすればよいですか?

4

3 に答える 3

1

ああ、私はそれが私の危険なスレッドだと思って一日を無駄にしましたが、今では他の人が私の痛みを共有しているのを見ています. まあ、少なくとも私はそれを見て一日を無駄にすることはありません.

しかし、私はソースコードを見ました。Tailer.java ファイルでエラーが発生していると確信しています。

boolean newer = FileUtils.isFileNewer(file, last); // IO-279, must be done first
...
...
else if (newer) {
    /*
    * This can happen if the file is truncated or overwritten with the 
    * exact same length of information. In cases like this, the file
    * position needs to be reset
    */
    position = 0;
    reader.seek(position);
...

データが書き込まれる前にファイル変更データが変更される可能性があるようです。これがなぜなのか、私は専門家ではありません。ネットワークからログ ファイルを取得しているため、おそらくあらゆる種類のキャッシュが行われているため、新しいファイルにこれ以上データが含まれていないという保証はありません。

ソースを更新し、このセクションを削除しました。私にとって、まったく同じバイト数でファイルが切り捨てられたり再作成されたりする可能性は最小限です。10MB のローリング ログ ファイルを参照しています。

これは既知の問題です (IO-279 LINK HERE )。ただし、解決済みとしてマークされており、明らかにそうではありません。開発者に連絡して、パイプラインに何かがあるかどうかを確認します。彼らは修正について私と同じ意見を持っているようです。

于 2013-01-09T18:16:37.773 に答える
0

https://issues.apache.org/jira/browse/IO-279?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

commons.io のどのバージョンを使用していますか? 2.0.1 でこのエラーが発生しました。2.3にアップデートしましたが、ちゃんと動いているようです(今のところ)

于 2012-06-07T13:54:23.223 に答える