【问题标题】:Java Program output printed in random position in Eclipse console在 Eclipse 控制台中随机位置打印的 Java 程序输出
【发布时间】:2013-08-10 05:30:22
【问题描述】:

我在 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 来显示消息?是这样吗?如果是这样,有没有办法解决乱序的问题?谢谢。

【问题讨论】:

    标签: eclipse multithreading logging slf4j stderr


    【解决方案1】:

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

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

    【讨论】:

    • 哦,其他的输出消息都是System.out.println()产生的。我可以将 SLF4J 配置为与标准输出同步吗?
    • SLF4J 是一个外观 API,用作大量日志框架的统一日志 API。应该在您使用的日志框架中进行配置。这可能是例如logback 或 log4j。如何进行配置取决于您在系统中使用的日志框架。
    • 知道了,谢谢。刚发现我的是Simple绑定,默认是outputs to stderr
    猜你喜欢
    • 1970-01-01
    • 2012-06-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多