使用log4j在日志文件中打印线程ID

Asi*_*sim 6 java logging multithreading log4j

我试图在我的日志文件中打印正在进行日志记录的线程的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>
Run Code Online (Sandbox Code Playgroud)

现在我假设我可以在我的布局中添加一些东西来打印线程.我还附上了我正在尝试此示例的示例代码,仅供参考

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();
 } 
}
Run Code Online (Sandbox Code Playgroud)

任何指导都会受到重视.谢谢

小智 23

在log4j 2 https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout

%tid 打印线程ID

  • 你的答案会更好地作为对问题的评论添加. (3认同)
  • @JavierElices 然后同样可以应用于我的答案。在这种情况下,答案中没有太多要说的,所以我认为它的简洁性和参考链接是有效的。 (2认同)

Fil*_*dor 12

%t 在ConversionPattern中为您提供线程的名称.

与线程ID不同,但总比没有好,并且在不触及代码的情况下工作.

更新:正如madcracker的回答所指出的:在log4j 2.x中有%tid线程ID.(+1给我的答案,在这里添加完整性.如果这对你有帮助,请提出他的答案!)