1

私の目標は、 java.util.logging(jdk1.6) を使用することです

  • すべてのログを同じログ ファイルに書き込み、
  • ログのローテーションを行う
  • ファイルパターンで %u を使用して、他のプログラムとの潜在的なファイル競合を回避できます

ルートロガーといくつかの名前付きロガーを構成しました。ルートロガーのハンドラーは設定java.util.logging.FileHandlerでに設定されています

java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.pattern = xxx.%u.log
java.util.logging.FileHandler.limit = 200000
java.util.logging.FileHandler.count = 20
java.util.logging.FileHandler.append = true

customFileH カスタマイズされた設定でに設定された名前付きロガーのハンドラー

customFileH.class = java.util.logging.FileHandler
customFileH.level = ALL
customFileH.formatter = xxxFormat

プログラムを実行すると、ルート ロガーがログを xxx.0.log に書き込みます。

名前付きロガーは、異なるログ ファイルとして、ログを xxx.0.log.1 に書き込みます。

私もファイルパターンで「%u」を取り出しました。ファイルローテーション構成に注目してください。それらは異なるログファイルに書き込みましたか。:(

コメントありがとうございます。:)

4

1 に答える 1

1

log4j スタイルの構成を java.util.logging に適用しようとしているようです。異なるフォーマッターで複数の FileHandler を作成する場合は、configオプションを使用して各 FileHandler をインストールする必要があります。構成クラスを作成します。

package so;
import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import java.util.logging.XMLFormatter;

public final class LoggingConfig {

    /**
     * Pin the loggers.
     */
    private static final Logger root = Logger.getLogger("");
    private static final Logger named = Logger.getLogger("some.name");

    /**
     * Configure the loggers.
     * @throws Exception if there is a problem.
     */
    public LoggingConfig() throws Exception {
        root.addHandler(newRootHandler());
        named.addHandler(newNamedHandler());
    }

    private FileHandler newRootHandler() throws IOException {
        FileHandler f = new FileHandler("simple%g.%u.log", 200000, 20, true);
        f.setFormatter(new SimpleFormatter());
        return f;
    }

    private FileHandler newNamedHandler() throws IOException {
        FileHandler f = new FileHandler("xml%g.%u.log", 200000, 20, true);
        f.setFormatter(new XMLFormatter());
        return f;
    }
}

次に、以下を logging.properties に追加します。

config=so.LoggingConfig

それ以外の場合は、logging.properties で使用できる新しいクラス名を作成するためだけに、FileHandler をサブクラス化できます。

ローテーションされたログを区別するには%gオプションを使用し、競合に対処するには %u オプションを使用する必要があります。FileHandler のドキュメントから:

したがって、3 つのプロセスがすべて fred%u.%g.txt にログを記録しようとした場合、ローテーション シーケンスの最初のファイルとして fred0.0.txt、fred1.0.txt、fred2.0.txt を使用することになります。

デフォルトでは、名前付きロガーはすべてルート ロガーのハンドラに書き込みます。したがって、何をしているかによっては、名前付きロガーにファイル ハンドラーをアタッチする必要がない場合があります。

于 2014-08-18T18:45:20.440 に答える