1

java.lang.SecurityManager を使用して、特定のシナリオに基づいてクラス アクセスまたはファイル アクセスをチェックおよび制限することを理解しています。

ヘルパー クラスを呼び出すクラスに基づいて、Logger インスタンスを返す必要がある Log4J ヘルパー クラスの呼び出し元を特定する必要があります。

これには 2 つの方法があります。

スレッドの使用

public static Logger getLogger() {
    final Throwable thread = new Throwable();
    final StackTraceElement callerMethod = thread .getStackTrace()[1];
    final Logger logger = Logger.getLogger(callerMethod .getClassName());
    return logger;
}

getLogger への呼び出しごとに現在のスタックトレースを取得する必要があるため、これはパフォーマンスのボトルネックです。

第二のアプローチ

java.lang.SecurityManager を拡張するロギング ヘルパー。この場合、使用できます

getClassContext()[2].getName();

ロガーをインスタンス化するための絶対クラス名を取得します。

SecurityManager を拡張する LoggingHelper は、その使用法を考慮すると、適切な設計原則ではないようです。

SecurityManager を Logging Utility に拡張できる理由はありますか、それともより良い方法がありますか?

注 : アプリケーションはアプリ サーバー インスタンスで実行されます。

4

1 に答える 1

1

Java EE 6 を使用している場合は、CDI を使用してロガーを挿入できます。

public class LoggerProducer {

    @Produces 
    public Log createLogger(final InjectionPoint injectionPoint) {
        final String name = injectionPoint.getMember().getDeclaringClass().getName(); 
        return Logger.getLogger(name);
    }
}
于 2012-12-29T01:30:54.887 に答える