私は、どのクラスの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;
}
}
感謝を!
私のブログで私のアイデアを公開しました:http://alexradzin.blogspot.com/2011/01/get-program-entry-point.html – AlexR
これは私が思っていた解決策(スレッドがmainというThreadGroupにmainという名前が付けられていることを確認する)が、私の目的のためには可能な限り一般的な目的である必要はありませんでした。より多くの状況下で動作する、より一般的なソリューションが必要な場合は、このアプローチを間違いなく使用します。 – apg