我正在尝试在我的日志文件中打印正在进行日志记录的线程的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();
}
}
任何指导都会受到重视。 谢谢
答案 0 :(得分:15)
在log4j 2中 https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout
%tid
打印线程ID
答案 1 :(得分:9)
%t
为您提供了帖子的名称。
与线程ID不同,但总比没有好,并且在不触及代码的情况下工作。
更新:正如madcracker的回答所指出的那样:在log4j 2.x中,线程ID为%tid
。 (+1给我的回答,在这里添加它是为了完整。如果这有助于你请upvote his answer!)
答案 2 :(得分:0)
如果您正在使用Log4j 1.x,则可以创建另一个实现Log4j功能的类。修改调试方法以将线程ID附加到消息中。
但是,您将需要在整个代码库中使用对自己的日志类的引用来批量替换Log4j定义。我假设您在类文件的顶部有一行,像这样:
Logger log = Logger.getLogger(MyService.class.getName());
这需要替换为对您的类的引用。
由于此类将是您的应用程序中现在引用Log4j的唯一点,因此如果需要,可以轻松地替换日志库。