6

この質問に簡単な答えがあることを願っています。Java アプリケーションにロガーを追加しようとしています。ログ ファイルを完全にフォーマットできましたが、ConsoleHandler をロガーに追加してコンソール出力をフォーマットしようとしたときに問題が発生しました。

ConsoleHandler を追加すると、すべてのログ メッセージが 3 回出力されません。2 回は必要な適切な書式設定で、次に 1 回は希望しない元の形式で出力されます。

以下にコードを投稿しますが、何が間違っているのかまったくわかりません。
どんな助けでも大歓迎です。

// remove and handlers that will be replaced
Handler[] handlers = logger.getHandlers();
for(Handler handler : handlers)
{
    if(handler.getClass() == ConsoleHandler.class || handler.getClass() == FileHandler.class)
        logger.removeHandler(handler);
}

// file handler
FileHandler fh = new FileHandler(file.toString());
fh.setFormatter(new MS2Formatter());
logger.addHandler(fh);

// console handler
ConsoleHandler ch = new ConsoleHandler();
ch.setFormatter(new MS2Formatter());
logger.addHandler(ch);

logger.setLevel(Level.INFO);

編集:答え

同様の問題を抱えている人を助けるために、ここに最終的なコードを投稿したかっただけです。

logger = Logger.getLogger("My Logger");     
logger.setUseParentHandlers(false);

// remove and handlers that will be replaced
Handler[] handlers = logger.getHandlers();
for(Handler handler : handlers)
{
        if(handler.getClass() == ConsoleHandler.class)
            logger.removeHandler(handler);
}

// setup the file
File file = new File(location + "/" + fileName);

// file handler
FileHandler fh = new FileHandler(file.toString(), true);
fh.setFormatter(new MS2Formatter());
logger.addHandler(fh);

// console handler
ConsoleHandler ch = new ConsoleHandler();
ch.setFormatter(new MS2Formatter());
logger.addHandler(ch);

// remove and handlers that will be replaced
logger.setLevel(Level.INFO);
4

2 に答える 2

15

正確にいくつのハンドラーが必要ですか? addHandler()作成したハンドラーを、そのロガーに関連付けられたハンドラーに追加します。これで、デフォルトのハンドラーと、コードに追加した 2 つのハンドラー (FileHandler と ConsoleHandler) ができました。

getHandlers()メソッドを使用してハンドラーの現在のセットを取得し、removeHandler()必要のないハンドラーを削除するために使用できます。

編集

あなたの場合、親ハンドラーが使用されている可能性があります。そのため、ハンドラーを削除していると思っていても、実際にコードをデバッグすると、for ループの実行中に実際にはハンドラーをまったく削除していないことがわかります (少なくとも ConsoleHandler は削除していません)。

親ハンドラーが使用されないようにするには、このステートメントを使用します。

logger.setUseParentHandlers(false);
于 2012-08-17T21:32:42.913 に答える
0

ConsoleHandlers を追加する前に、古いコンソール ハンドラーを削除してください。元のコンソール ハンドラーを変更しない方法でコンソールにログを記録している可能性があります。また、新しく追加されたコンソール ハンドラーの出力をエコーするチェーンにも含まれているため、メッセージごとに 3 つのログが作成されます。

于 2012-08-17T21:30:34.267 に答える