log4j2:在工作线程加入主线程后刷新日志



我使用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.
  1. 为每个线程定义一个Logger对象
  2. 对于来自(1(的Logger,禁止向上传递日志(将additivity设置为false(
  3. 从(1(向Logger添加一个WriterAppender,传入一个ByteArrayOutputStream实例
  4. 连接线程后,获取(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");
    }
}

最新更新