1

私の既存のアプリケーション「org.apache.log4j」では、APIがJavaコードで使用されています。

要件 :

いずれにせよ、いくつかのステートメント(たとえばxyz)をログファイルに記録する必要があり、ログレベルに依存しないようにする必要があります。たとえば、ログレベルがエラーの場合は、xyzも出力され、ログレベルがデバッグの場合は、xyzも出力されます。 。

xyzのログステートメントをデバッグすることはできません。これを行うと、xyz以外の他のログステートメントも印刷を開始するためです。

このためには、カスタムログレベルを追加する必要があると思います。その方法と、どのような場合でも印刷されるようにレベルの順序を設定する方法を教えてください。

前もって感謝します。よろしくお願いします

4

3 に答える 3

4

あなたができることはLogger、それらのステートメントに異なるものを作成することです(ロガーを定義するときにクラス名を使用するように制限されていません)

// Standard logger
private static Logger log = Logger.getLogger(MyClass.class)

// XYZ logger
private static Logger logXYZ = Logger.getLogger("logs.xyz");

複数のクラスから同じロガーにアクセスできます。同じラベルを渡すだけです。

次に、構成ファイルで、そのカテゴリに別のログレベルを定義し、これらのログを別のアペンダー(別のファイル、処理など)に出力することもできます。

于 2012-08-23T10:50:15.283 に答える
4

保護されたメソッドを「ハイジャック」して、Logger#forcedLog()常にログに出力することができます。

ハイジャック犯クラスは、と同じパッケージに配置する必要がありますLogger

package org.apache.log4j;

/**
 * @author maba, 2012-08-23
 */
public class LogOverride {
    public static void print(Logger logger, String message) {
        logger.forcedLog(logger.getName(), Priority.INFO, message, null);
    }
}

そしてあなたの発信コードから

log.setLevel(Level.OFF); // Make sure logging is turned off
log.info("Normal logging"); // Will not be seen anywhere
LogOverride.print(log, "Overriding logger"); // Will still make it to your appender

これは、log4jFAQがカスタムレベルについて述べていることです。

カスタムレベルを追加するにはどうすればよいですか?

可能ですが、適切なことはめったにありません。リクエストは通常​​、「監査」のような名前のレベルで、「トレース」、「デバッグ」、「情報」、「警告」、「エラー」、「致命的」の進行に明らかに適合しません。その場合、レベルのリクエストは、実際には別のオーディエンスを指定するメカニズムのリクエストです。適切なメカニズムは、「監査」関連のメッセージに個別のロガー名(またはツリー)を使用することです。

したがって、その提案を採用したい場合は、SJuan76からの回答を確認する必要があります。

于 2012-08-23T11:21:30.857 に答える
0

カスタムを作成するというアイデアを採用する場合は、Levelコンストラクターがであるため、これを行うためにLevelのサブクラスを作成する必要がありますprotected

/**
 * Instantiate a Level object.
 */
 protected Level(int level, String levelStr, int syslogEquivalent) {
     super(level, levelStr, syslogEquivalent);
 } 

次に、コンストラクターにチェーンして、適切な値を渡す必要があるようです。レベル番号が大きいほど、優先度が高くなることに注意してください。したがって、既存の名前付きレベルのいずれでもブロックされない場合は、よりも大きい値が必要です。LevellevelLevelPriority.FATAL_INT50000

(ただし、これが正しいアプローチであるとは確信していません。まず、ログ構成ファイルでカスタムレベルを名前で参照できない可能性があります。)

于 2012-08-23T11:06:59.837 に答える