2017-04-10 9 views
1

私はJavaでログを記録する目的でlog4jを使用しています。 log.info(何らかのメッセージ)を使用すると、その関数が呼び出されているAPIと、そのメッセージと一緒にログに記録されます。 ここで私のケースのシナリオは、コードスニペットで説明しているものとは異なります。Javaのログインのためにメソッドが呼び出されているクラスの名前を取得する

ClassA{ 
void log(String message){ 
    log.info(message); 
    } 
} 

ClassB{ 
classA obj = new classA(); 
obj.log("hello"); 
} 

この場合、ロギング中にlog4jはログファイルにclassAを記録します。しかし、私はAの代わりにclassBを表示したい。

答えて

1

あなたが呼び出したクラスの名前を含むもう1つのパラメータを使用できます。

ClassA{ 
void log(String message, String className){ 
// Edit the log4j details 
log.info(message); 
} 
} 

ClassB{ 
classA obj = new classA(); 
obj.log("hello", this.getClass().getSimpleName()); //here 
} 
0

別のロガーインスタンスを使用している可能性がありますか?

ClassA{ 
void log(String message){ 
    log.info(message); 
    } 
} 

ClassB{ 
    classA obj = new classA(); 
    LogFactory.getLog(ClassB.class).info("hello"); 
} 
+0

を解決しましたか? LoggerFactory.getLogger(clazz).info(message)を使うことができるように、その行をlogメソッドに移動し、 'Class clazz'引数(=>' void log(String message、Class clazz) '。 – Fildor

+0

あなたはこれがどのように機能しているかを詳しく説明できますか? –

+0

私はlog4jからlog.info()を使用してログに記録したいが、前のクラスのクラス名を取得する理由を変更しないという制限がある –

1

さて、あなたが見ているとそれはかなり不必要と思われるように、カスタムクラス内Loggerオブジェクトをラップし、... ...それはあなたが通常持っていないと、この問題を紹介します。

ただし、動作させることは可能かもしれません。内部的には、log4j書式設定コードは、現在のスタックトレースを取得して呼び出し元のクラス、メソッド、およびソースファイル/行を識別するためにそれをトラッキングするためのExceptionオブジェクトを作成しています。あなたができることは、(通常はカスタムクラスのものをオーバーライドすることによって)動作を変更することです。そのため、通常は使用するスタックから次のスタックフレームを使用します。

残念ながら、関連するlog4jコードはすべて抽象度が高く、それに従うのがむずかしいです。必要な変更を行うための最善の方法を理解するのに数時間かかるでしょうし、そうする傾向はありません。 (私が最初に述べたように、あなたがしたことは悪い考えです...)

1

log4jのコンストラクタを作成してログに残しておきたいクラス名を渡してくださいあなたは通常行うことができます。

+0

同じことをして、私の問題を解決しました。 –

1

は私がやったことは

private static MyLogger logger = MyLogger.getLogger(GetPlanOptionsForPackage.class) 

、その後

logger.error("input cannot be null"); 

を定義している、これはあなたがのために `log`メソッドを何が必要でしょう私のユースケース

関連する問題