2013-08-10 1 views
1

У меня есть класс JUnit в проекте Eclipse. Это похоже на следующее:Выход программы Java, напечатанный в произвольной позиции в консоли Eclipse

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 */ 

Однако, результат, показанный в консоли, как правило, messed up like:

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

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

Это случается очень часто с другими моими кодами, когда есть сообщения об исключении.

Мое предположение: stderr и stdout обрабатываются в разных потоках, поэтому результат будет отображаться без определенного порядка.

Поскольку информация от Logger также красная на консоли Eclipse, я предполагаю, что она использует stderr для отображения сообщения? это так? если да, то есть ли способ решить проблему перепутанного порядка? Благодарю.

ответ

0

Какая структура ведения журналов вы используете с SLF4J? Возможно, что структура ведения журнала настроена так, чтобы записывать сообщения журнала асинхронно в фоновом потоке.

Вы можете попытаться заменить вызов журнала System.out.println() и посмотреть, дает ли это результат, который вы ожидаете. Если это возможно, вы можете захотеть перенастроить структуру ведения журнала для синхронного протоколирования сообщений.

+1

О, другие выходные сообщения производятся только 'System.out.println()'. Могу ли я настроить SLF4J на синхронизацию с stdout? – Will

+0

SLF4J - это API-интерфейс фасада, который служит в качестве единого API протоколирования для большого количества фреймворков регистрации. Конфигурация должна быть выполнена в используемой вами структуре ведения журнала. Это может быть, например, logback или log4j. Как настроить конфигурацию зависит от того, какую структуру ведения журнала вы используете в своей системе. – glerup

+1

Получил, спасибо. Просто выяснили, что моя - это «простая» привязка, по умолчанию она «выводится на stderr» (http://www.slf4j.org/apidocs/org/slf4j/impl/SimpleLogger.html). – Will