2017-12-14 15 views
0

logbackを使用していますが、ログラークラスを直接呼び出す代わりに を使用しています。 データを記録するカスタムクラス/ラッパークラスがあります。 (これは使用時に必要です)。 ラッパークラスではなく、このラッパー クラスを呼び出すソースクラス名を出力したいと思います。 私はこのクラスでロギングしようとしましたが、常にラッパークラスのclassNameを表示しています。ログバック - クラス名を出力

class MyAppLogTest { 

public static void main(String args[]) { 

    String msg="Some Msg"; 
    ApplicationLogger.logData("MyAppLogTest", "main",msg); 
    } 
} 


import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

class ApplicationLogger { 

private static Logger logger = null; 

    static { 
     logger = (Logger) LoggerFactory.getLogger(ApplicationLogger.class); 

    } 

public static void logData(final String clazz, final String method,final String msg) { 
     logger.info(msg); 
    } 
} 

よろしく

+0

あなたは 'this'クラスを使って' this'クラスをログに記録しようとしましたか?質問にコードを含める必要があります。それはあなたが何を求めているかをより明確にします。 – zaerymoghaddam

+0

コードを追加しました。 – oxygenan

+1

このラッパーを使用して根本的な問題を解決しようとしていますか?あなたが(そのような)ホイールを再発明しているからです。ロガー自体は、簡単なプロパティファイルを使用して構成可能な同じサービスを提供します。たぶん根本的な問題を知ることで、私はあなたに良い答えを与えることができるでしょう – zaerymoghaddam

答えて

0

ない優れたソリューション、 いますが、スタックから呼び出し元のクラスを引き、ログメッセージに使用することができます。このような

これを行うには、あなたが行うことができるもの:

final StringBuilder returnValue = new StringBuilder(); 
    final Throwable throwable = new Throwable(); 

    try 
    { 
     final StackTraceElement[] elements = throwable.getStackTrace(); 
     final String methodName; 

     if ((elements != null) && 
      (elements.length > 2)) 
     { 
      methodName = elements[2].getMethodName(); 

      returnValue.append(methodName); 
      returnValue.append("()"); 
     } 
    } 
    catch (Exception ignoredException) 
    { 
     // use some default value. 
    } 

    return returnValue; 

が目的のクラスのインデックスはあなたのための2でなくてもよいです。

+0

しかし、これは例外の場合には動作しますが、例外ではないシナリオもカバーする必要があります。私はApplicationLoggerクラスから印刷する際にクラス名として "MyAppLogTest"を記録する必要があります。そうすれば、ApplicatonLoggerを呼び出すソースクラス名をログに記録することができるでしょう – oxygenan

+0

私はコードを読んでいます。しかし、ボリュームが高い場合は特にThrowableを作成するオーバーヘッドはありません。 – oxygenan

+0

「クラス名を自動的にログに記録したい」という文は、「余分なオーバーヘッドは気にしません」と同じです。 – DwB

0

ロガーを呼び出したメソッドの名前にアクセスするための素敵な方法があるかどうかはわかりません。場合

class MyAppLogTest { 
    // An static instance of your custom logger initialized with 
    // the class that would call it 
    private static ApplicationLogger applicationLogger = new ApplicationLogger(MyAppLogTest.class); 

    public static void main(String args[]) { 
     String msg="Some Msg"; 
     applicationLogger.logData("main", msg); 
    } 
} 


import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

class ApplicationLogger { 

    private static Logger logger; 
    private Class callingClass; 

    public ApplicationLogger(Class callingClass) { 
     this.callingClass = callingClass; 
     this.logger = (Logger) LoggerFactory.getLogger(callingClass); 
    } 
} 

public static void logData(final String method, final String msg) { 
    logger.info(method + "-" + msg); 
} 

}

:しかし、私は、呼び出し元のクラス名にアクセスするためのソリューションは、このような何か(私はそれを実行する時間を持っていなかったが、私はそれが仕事だと思う)ことができると思いますメソッド名にアクセスすることは非常に重要です。タイプMethodの別のプロパティをApplicationLoggerクラスに追加し、コンストラクタで初期化することができます。次に、メソッドごとにロガーをインスタンス化できます(これは簡単にパフォーマンスのボトルネックになる可能性があります)。そして、現在のメソッドをそのパラメーターとして渡します。

また、私は、Aspect Oriented Programmingのテクニック/ライブラリを見てみる価値があると思います。たぶん、元の問題のAOPベースの別の解決策を見つけることができます。

関連する問題