14

log4j に同じ構成情報を使用する必要がある、同時に実行される複数のジョブがあります。それらはすべて、同じアペンダーを使用してログを 1 つのファイルにダンプしています。各ジョブがログ ファイルに動的に名前を付けて、別々のままにする方法はありますか?

ありがとう
トム

4

10 に答える 10

21

各ジョブに Java システム プロパティを渡すことはできますか? その場合、次のようにパラメータ化できます。

java -Dmy_var=somevalue my.job.Classname

そして、log4j.properties で:

log4j.appender.A.File=${my_var}/A.log

ジョブのインスタンスを一意に識別する (たとえば) ホストの環境からの値を Java システム プロパティに入力できます。

于 2008-09-17T14:49:20.623 に答える
3

ジョブ名が事前にわかっている場合は、getLogger() 呼び出しを行うときにジョブ名を含めることができます。次に、異なるファイル名 (または他の宛先) を使用して、異なるアペンダーを異なるロガーにバインドできます。

事前にジョブ名がわからない場合は、構成ファイルを使用する代わりに、実行時にロガーを構成できます。

FileAppender appender = new FileAppender();
appender.setFileName(...);
appender.setLayout(...);
Logger logger = Logger.getLogger("com.company.job."+jobName);
logger.addAppender(appender);
于 2008-09-17T14:48:43.620 に答える
3

私たちのシステムには、似たようなものが実装されています。特定のロガーを HashMap に保存し、必要に応じてそれぞれのアペンダーを初期化します。

次に例を示します。

public class JobLogger {
private static Hashtable<String, Logger> m_loggers = new Hashtable<String, Logger>();
private static String m_filename = "...";  // Root log directory

public static synchronized void logMessage(String jobName, String message)
{
    Logger l = getJobLogger(jobName);
    l.info(message);
}

public static synchronized void logException(String jobName, Exception e)
{
    Logger l = getJobLogger(partner);
    l.info(e.getMessage(), e);
}

private static synchronized Logger getJobLogger(String jobName)
{
    Logger logger = m_loggers.get(jobName);
    if (logger == null) {
        Layout layout = new PatternLayout("...");
        logger = Logger.getLogger(jobName);
        m_loggers.put(jobName, logger);
        logger.setLevel(Level.INFO);
        try {
            File file = new File(m_filename);
            file.mkdirs();
            file = new File(m_filename + jobName + ".log");
            FileAppender appender = new FileAppender(layout, file.getAbsolutePath(), false);
            logger.removeAllAppenders();
            logger.addAppender(appender);
    }
        catch (Exception e)
    { ... }
    }
    return logger;
}
}

次に、これをジョブで使用するには、次のような 1 行のエントリを使用するだけです。

JobLogger.logMessage(jobName, logMessage);

これにより、ジョブ名ごとに 1 つのログ ファイルが作成され、指定したディレクトリ内のそのジョブ名を持つ独自のファイルにドロップされます。

他のタイプのアペンダーなどをいじることができます。書かれているように、JVMが再起動されるまで追加を続けますが、常に稼働しているサーバーで同じジョブを実行すると機能しない可能性がありますが、これにより、どのようにできるかについての一般的なアイデアが得られます仕事。

于 2008-09-17T16:23:16.500 に答える
2

各ジョブに NDC または MDC を設定してから、NDC または MDC の値に基づいて名前を変えるアペンダーを作成できます。新しいアペンダーを作成するのはそれほど難しくありません。log4j サンドボックスの法案に適合するアペンダーもあるかもしれません。http://svn.apache.org/viewvc/logging/log4j/trunk/contribs/を調べ始めます

于 2008-09-17T15:24:16.437 に答える
1

おそらく [File.createTempFile]( http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#を使用して、独自のファイル名を構成する独自のアペンダーを作成できます。createTempFile(java.lang.String,%20java.lang.String))メソッド。FileAppenderクラスが正しく記述されていれば、クラスを拡張するかRollingFileAppender、メソッドをオーバーライドして、getFile追加する新しいプロパティに基づいて選択したクラスを返すことができるはずです。

于 2008-09-17T14:52:33.003 に答える
1

shaditの答えに基づいています。どのクラスのメイン メソッドが開始されたかによって各ジョブを識別できる場合は、開始されたクラスのsun.java.command完全な名前を含むシステム プロパティを使用できます。たとえば、次のようにします。

log4j.appender.LOGFILE.File=${sun.java.command}.log

次のようにTimestampFileAppenderと一緒に使用します。

log4j.appender.LOGFILE=TimestampFileAppender
log4j.appender.LOGFILE.TimestampPattern=yyyy_MM_dd__HH_mm
log4j.appender.LOGFILE.File=${sun.java.command}_{timestamp}.log

このようにして、Eclipse で開発しているときに、実行する新しいプロセスごとに新しいログ ファイルを取得します。ログ ファイルは、メイン メソッドを持つクラスのクラス名と開始時刻によって識別されます。

于 2012-11-30T07:32:59.620 に答える
0

以下を実装できます。

  • ジョブの ID の ThreadLocal ホルダー。
  • FileAppender を拡張します。FileAppender は、ジョブ ID ごとに QuietWriter を保持する Map を保持する必要があります。メソッド subAppend では、ThreadLocal からジョブの ID を取得し、QuietWriter を検索 (または作成) して書き込みます...

もしよろしければ、コードをメールでお送りすることもできます...

于 2008-09-17T15:35:39.263 に答える
0

ジョブを初期化するときに、log4j をプログラムで構成できます。

システム プロパティを使用して、実行時に log4j.properties ファイルを設定することもできます。マニュアルから:

リソース文字列変数をlog4j.configurationシステム プロパティの値に設定します。デフォルトの初期化ファイルを指定するには、log4j.configuration システム プロパティを使用することをお勧めします。システム プロパティ log4j.configuration が定義されていない場合は、文字列変数 resource をデフォルト値の「log4j.properties」に設定します。

異なる Java コマンドからジョブを実行していると仮定すると、これにより、異なる log4j.properties ファイルとそれぞれに異なるファイル名を使用できるようになります。

あなたの仕事がどのように実行されているかについての具体的な知識がなければ、それを言うのは難しいです!

于 2008-09-17T14:44:55.703 に答える
0

あなたが指定できるトムと各ジョブのアペンダー。2 つの異なる Java パッケージ com.tom.firstbatch と com.tom.secondbatch に対応する 2 つのジョブがあるとします。 log4j.xml には次のようなものがあります。

   <category name="com.tom.firstbatch">
      <appender-ref ref="FIRST_APPENDER"/>
   </category>
   <category name="com.tom.secondtbatch">
      <appender-ref ref="SECOND_APPENDER"/>
   </category>
于 2008-09-17T14:47:14.030 に答える
0

log4j.logger.com.foo.admin=,AdminFileAppender log4j.logger.com.foo.report=,ReportFileAppender

このタスクを実行する別の方法です。ここで com.foo.admin は完全なパッケージ名です

于 2012-09-29T06:01:20.370 に答える