2011-01-13 7 views
1

私は、どのクラスのmainメソッドが呼び出されたのかを動的に判断して、結合されたログファイルを簡単に消化できるようにしたいと思います。どのクラスの `main`メソッドが実行時に呼び出されたかを知るにはどうすればいいですか?

現在のところ、1つの(回転した)ログファイルは、いくつかのデーモンからのすべてのログ出力を集約しますが、すべてのデーモンが共有コードベースを使用するため、 log4jのgetLogger(Something.class)を使用してロガーが作成されます

実際に情報を出力するには、カスタムレイアウトクラスを使用しているので、実際には問題はありませんが、それを見つけることができます。

フォールバックとして機能する1つのアプローチは、呼び出し時にプロパティを定義し、そのプロパティを読み取ることです。

java -cp ... -Dmain.program=<WHATEVER> MainProgram 

ただし、この能力が既に存在する場合は、新しい規約を作成する必要はありません。

更新:私の目的のためには、以下の罰金に動作するようです:提案のため

import org.apache.log4j.PatternLayout; 
import org.apache.log4j.spi.LoggingEvent; 
public class MyLayout extends PatternLayout { 
    private static String _mainClass = null; 
    public String format(LoggingEvent event) { 
    String mesg = super.format(event); 
    if (mesg.indexOf("$main") > -1) { 
     mesg = mesg.replaceAll("\\$main", getMainClass()); 
    } 
    return mesg; 
    } 
    private static String getMainClass() { 
    if (_mainClass == null) { 
     StackTraceElement[] elem = new Exception().getStackTrace(); 
     int offset = elem.length - 1; 
     if (elem[offset].getMethodName().equals("main")) { 
     _mainClass = elem[offset].getClassName(); 
     } 
     else { 
     _mainClass = "<Unknown_Main_Class>"; 
     } 
    } 
    return _mainClass; 
    } 
} 

感謝を!

+0

私のブログで私のアイデアを公開しました:http://alexradzin.blogspot.com/2011/01/get-program-entry-point.html – AlexR

+0

これは私が思っていた解決策(スレッドがmainというThreadGroupにmainという名前が付けられていることを確認する)が、私の目的のためには可能な限り一般的な目的である必要はありませんでした。より多くの状況下で動作する、より一般的なソリューションが必要な場合は、このアプローチを間違いなく使用します。 – apg

答えて

2

一度だけ実行する必要がある場合は、例外スタックを歩いて最後のクラス/メソッド呼び出しを確認できます。

StackTraceElement[] elem = new Exception().getStackTrace(); 
    elem[elem.length - 1].getClassName(); 

ただし、エラーが発生しやすいです。リフレクションでクラスをロードすると、上に完全に異なるメソッドが表示されます。

(メインメソッドシグネチャと一致する)M。Jessupバリアントを試すことができますが、コードからメインメソッドを呼び出すと失敗します。

1

これはちょっとハッキリですが、静的メソッドThread.getAllStackTraces()を使用できます。これにより、VM内のすべてのライブスレッドのスタックトレースが取得され、アプリケーションを起動したスレッドがまだ生存していると仮定してトレースを検査し、main(String [] args)と一致するメソッドシグネチャを持つボトム要素を検索できます。

+0

Hmm。私はこれを一度だけ行う必要があるので、それは興味深いオプションです。 – apg

0

Veera SundarはLog4jのMapped Diagnostic Context(サーブレットフィルタのソースコード)http://veerasundar.com/blog/2009/11/log4j-mdc-mapped-diagnostic-context-example-code/の使用方法に関する2つの記事を書いています。

アプリケーションクラス(mainメソッドを持つ)にクラス名を変数として追加して、ログファイルに書き込むことができます。

実行時にプロパティを追加するよりも機能は少ないですか?いいえ、実際よりもエレガントではありません。

関連する問題