web-dev-qa-db-ja.com

log4jを使用してログファイルにスレッドIDを出力する

ロギングが行われているスレッドのIDをログファイルに出力しようとしています。私はlog.info(Thread.currentThread().getId())によってコードレベルでそれを行いました。ここで、「log」はLoggerクラスオブジェクトですが、これは私が正確に望んでいるものではありません。実際、私のアプリケーションは大規模な分散アプリケーションであり、コード内のThread.currentThread().getId()ごとにlog.info("something")を追加することはできません。とにかく、自分のlog4j.xmlファイルに変更を加えて、コード内のすべてのlog.infoのスレッドIDを出力できる方法はありますか?これは私のlog4j.xmlです

<log4j:configuration debug="true">
<!-- File Appenders -->

<appender name="EventsAndErrorsFileAppender" class="org.Apache.log4j.RollingFileAppender">
    <param name="File" value="EventsAndErrors.xml" />
    <param name="Datepattern" value="'.'yyyy-MM-dd-HH" />
    <param name="MaxFileSize" value="1000KB" />
    <param name="MaxBackupIndex" value="140" />
    <layout class="org.Apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{ISO8601} %-5p [%C] %m%n" />
    </layout>
    <filter class="org.Apache.log4j.varia.LevelRangeFilter">
        <param name="LevelMin" value="INFO" />
        <param name="LevelMax" value="ERROR" />
    </filter>
</appender>

<root>
    <priority value="debug" />
    <appender-ref ref="EventsAndErrorsFileAppender" />
    <appender-ref ref="ExceptionFileAppender" />
</root>

今、私は自分のレイアウトに何かを追加して、スレッドを印刷できると想定しています。参考のためにこれを試しているサンプルコードも添付しています

import org.Apache.log4j.Logger;

class MyThread extends Thread implements MyInterface
  {
   public void run()
    {
    int i = 0;
    while(i < 10)
    {
        System.out.println(Thread.currentThread().getId()+"In first        thread");
        log.info(Thread.currentThread().getId());
        log.error(Thread.currentThread().getId());
        System.out.println();
        i++;
    }   

  }
}
class MyThread1 extends Thread implements MyInterface
{

public void run()
{
    int i = 0;
    while(i < 10)
    {
        System.out.println(Thread.currentThread().getId()+"In secound thread");
        log.info(Thread.currentThread().getId());
        log.debug("debug");
        System.out.println();
        i++;
    }
}
}

public class MyClass implements MyInterface
{
 public static void main(String[] args) {
    // TODO Auto-generated method stub


    MyThread thread1 = new MyThread();
    MyThread1 thread2 = new MyThread1();


    log.info("logging stareted");
    thread1.start();
    thread2.start();
 } 
}

どんなガイダンスも認められます。ありがとう

9
Asim

Log4j 2内 https://logging.Apache.org/log4j/2.x/manual/layouts.html#PatternLayout

%tidはスレッドIDを出力します

24
yuugen

%t ConversionPatternのは、スレッドの名前を示します。

スレッドIDと同じではありませんが、何よりも優れており、コードに触れることなく機能します。

更新:yuugenの答えが指摘するように:in log4j 2.xそこでは%tidはスレッドIDです。 (私からの彼の回答に+1、完全にするためにここに追加。これが役立つ場合は、賛成投票してください hisanswer !)

13
Fildor