我使用log4j2将日志写入控制台,并为多个线程写入文件。我不想混合来自不同线程的行,而是希望保留工作线程的日志,并且只在工作线程加入主线程时刷新它们。我该怎么做?
例如,不需要像这样的日志
Thread 1 started.
Thread 2 started.
Thread 1 working...
Thread 2 working...
Thread 1 working...
Thread 2 working...
Thread 1 finished.
Thread 2 finished.
我想要:
Thread 1 started.
Thread 1 working...
Thread 1 working...
Thread 1 finished.
Thread 2 started.
Thread 2 working...
Thread 2 working...
Thread 2 finished.
- 为每个线程定义一个
Logger
对象 - 对于来自(1(的Logger,禁止向上传递日志(将additivity设置为false(
- 从(1(向Logger添加一个
WriterAppender
,传入一个ByteArrayOutputStream
实例 - 连接线程后,获取(3(中定义的
OutputStream
并进行相应处理
例如:
public static void main(String[] args) throws Exception{
BasicConfigurator.configure();
LoggerRunner[] runners = new LoggerRunner[]{new LoggerRunner("t1"), new LoggerRunner("t2")};
Thread t1 = new Thread(runners[0]);
Thread t2 = new Thread(runners[1]);
t1.start();
t2.start();
t1.join();
System.out.println("Joined 1");
t2.join();
System.out.println("Joined 2");
System.out.print(new String(runners[0].getLog()));
System.out.print(new String(runners[1].getLog()));
}
private static class LoggerRunner implements Runnable{
private final Logger logger;
private ByteArrayOutputStream logs = new ByteArrayOutputStream();
private final String name;
public LoggerRunner(String name){
this.name = name;
logger = Logger.getLogger(name);
logger.setAdditivity(false);
logger.addAppender(new WriterAppender(new PatternLayout("%-1r [%t] %-5p %c %x - %m%n"), logs));
}
public byte[] getLog(){
return logs.toByteArray();
}
@Override
public void run() {
logger.info(name + " started");
try{
Thread.sleep(1000);
logger.info(name + " working");
Thread.sleep(1000);
}catch(Exception e){}
logger.info(name + " finished");
}
}