控制台在线程内的日志记录是不准确的

时间:2013-05-21 04:04:14

标签: multithreading logging log4j logback

我正在使用logback实现并创建了一个AsyncAppender,以便在线程中使用日志记录。

该线程将类似于监视器:它消耗从其他线程添加的BlockingQueue个对象,并且当队列不为空时,并且没有阻塞信号它记录队列的内容。同时,队列由几个线程填充。

当线程从协调器获得停止信号时,它们会中断,因此它们不会在队列中添加更多内容。

一旦有阻塞信号(生产者线程已经中断)并且BlockingQueue为空,监视器队列就会中断。

监控线程的日志记录存在两个问题:

  1. 生成器中断后,队列变为空,因此监视器线程也会立即中断,而不显示队列中的所有内容,即使它从队列中删除了所有内容。

  2. 显示的消息(在控制台appender和文件追加器中)的顺序与它们在队列中插入的顺序不同

  3. 我尝试了3种不同的方法:在线程中创建一个静态记录器,创建一个非静态记录器,并从创建监视器线程的类中提供一个加载器。

    如果我在监视器线程中执行while(true){}循环中的所有操作,则会显示所有内容但不是正确的顺序,以及我必须找出如何中断线程的事实。

    我还检查了MDC的情况,但我的问题在某种程度上有所不同:我必须消费生产者的产品,并在他们生产时这样做,加上他们完成以防万一仍有东西队列。

    我还检查了线程中的LoggerContext,它的启动是假的。不应该是真的;

    在中断线程并以正确的顺序显示之前如何显示所有内容的任何想法都是有价值的。

    感谢。

0 个答案:

没有答案