1

私はいくつかのシステムを作成しましたが、実行中にそのシステムに関する統計を追跡したいと考えています。これらの統計を書き留めるために、TSV フォームを使用することにしました。既存の最適な lib を探しているときに (可能であれば、自分で実装することは避けたいと思います)、FileHandler lib がまさに私が求めているものであることがわかりました。

統計は毎秒収集されるため、ファイル ハンドラーが提供するサイズ制限で何らかのログ ファイルのローテーションが必要だと思いますが、まだ見逃しており、私にとって重要なのは、すべてのログ ファイルに一定のヘッダーを含める機能です。 .

したがって、すべてのログ ファイルのカスタムの最初の行 (TSV 形式の列の意味を含む) をローテーションし、残りの行は実際の統計値になるようにしたいと考えています。

誰もこれを達成する方法を知っていますか? 私や他の同様の質問に合ったライブラリを見つけることができませんでした。

また、これを達成できる他のライブラリを知っている場合は、FileHandler を捨てて、そのライブラリを優先します。

前もって感謝します!

編集:@jmehrensから提供された回答に基づいて、次のコードを作成しましたが、魅力的に機能します! カスタムフォーマッタクラスは次のとおりです。

class CustomFormatter extends Formatter {
    @Override
    public String format(LogRecord record) {
        return record.getMessage() + "\n";
    }
    @Override
    public String getHead(Handler h) {
        return "header\n";
    }
}

ワーカーコードは次のとおりです。

String path = "/tmp/temp2";
FileHandler fileHandler = new FileHandler(path, 300, 5);
fileHandler.setFormatter(new CustomFormatter());

Logger logger = Logger.getLogger("sam.logging");
logger.addHandler(fileHandler);

for(int i = 0; i < 10000; i++)
    logger.log(new LogRecord(Level.INFO, i+" aaaaaaaaaaaaaa."));

出力例は次のとおりです。

[/tmp] -> cat temp2.3
header
9957 aaaaaaaaaaaaaa.
9958 aaaaaaaaaaaaaa.
9959 aaaaaaaaaaaaaa.
9960 aaaaaaaaaaaaaa.


[/tmp] -> cat temp2.1
header
9985 aaaaaaaaaaaaaa.
9986 aaaaaaaaaaaaaa.
9987 aaaaaaaaaaaaaa.
9988 aaaaaaaaaaaaaa.
9989 aaaaaaaaaaaaaa.
4

1 に答える 1

2

カスタム java.util.Formatterを作成し、FileHandler にインストールする必要があります。Formatter.getHeadメソッドは、ヘッダーを書き込むために使用され、FileHandler が開いているか回転するたびに呼び出されます。この場合、 Formatter.formatメソッドを使用して、特定の LogRecord ごとに 1 行のデータを生成します。したがって、1 秒ごとに 1 つの LogRecord を生成 (または再利用)し、それを FileHandler に公開する必要があります。

于 2016-03-08T19:25:59.803 に答える