Java程序输出在Eclipse控制台中以随机位置打印

时间:2013-08-10 05:30:23

标签: eclipse multithreading logging slf4j stderr

我在Eclipse项目中有一个JUnit类。它如下所示:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/*some other imports*/

public class _JunitTests{
    final Logger logger = LoggerFactory.getLogger(_JunitTests.class);   
    public void test(int num){
            logger.info("**** tests no."+num+" ***");
            /* some code */
    }   
    @Test
    public static void test1() {
            test(1);
    } 
    @Test
    public static void test2() {
            test(2);
    } 
    @Test
    public static void test3() {
            test(3);
    } 
    @Test
    public static void test1() {
            test(1);
    } 
}

当我运行所有测试时,我期待输出如[信息的类信息被忽略]

**** tests no.1 ***
/* somethings */

**** tests no.2 ***
/* somethings */

**** tests no.3 ***
/* somethings */

但是,控制台中显示的结果通常会搞砸:

**** tests no.1 ***
**** tests no.2 ***
**** tests 
/* somethings */

no.3 ***
/* somethings */
/* somethings */

当存在异常消息时,我的其他代码会发生这种情况。

之前的猜测是stderr和stdout在不同的线程中处理,因此结果将在没有特定顺序的情况下显示。

由于Logger中的信息在Eclipse控制台中也是红色的,我的猜测是它使用stderr显示消息?是这样的吗?如果是这样,有没有办法解决乱搞顺序的问题?感谢。

1 个答案:

答案 0 :(得分:0)

您对SLF4J使用哪种日志框架?可能是日志框架配置为在后台线程中异步写入日志消息。

您可以尝试用System.out.println()替换日志调用,看看是否会产生您期望的输出。如果是,您可能需要重新配置日志记录框架以同步记录消息。