1

結合されたログファイルをより簡単にダイジェストできるようにするために、どのクラスのmainメソッドが呼び出されたかを動的に判別したいと思います。

現在、単一の(ローテーションされた)ログファイルは、多数のデーモンからのすべてのログ出力を集約しますが、すべてのデーモンが共有コードベースを使用し、ロガーが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;
  }
}

提案をありがとう!

4

3 に答える 3

2

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

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

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

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

于 2011-01-13T15:20:48.547 に答える
1

少しハックですが、静的メソッドThread.getAllStackTraces()を使用できます。これにより、VM内のすべてのライブスレッドのスタックトレースが取得され、アプリケーションを開始したスレッドがまだ稼働していると仮定して、トレースを調べ、メソッドシグネチャがmain(String [] args)と一致する下部要素を探すことができます。

于 2011-01-13T15:19:36.493 に答える
0

Log4jVeera Sundarは、のマップされた診断コンテキスト(サーブレットフィルタのソースコード)の使用方法に関する2つの記事を書いています。http: //veerasundar.com/blog/2009/11/log4j-mdc-mapped-diagnostic-context-example-code/ユースケースに合わせて変更できる可能性があります。

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

実行時にプロパティを追加するよりも作業が少ないですか?いいえ、そうではありませんが、よりエレガントです

于 2011-01-13T15:35:42.207 に答える