2015-12-08 1 views
6

У меня есть простая установка, чтобы войти сообщение: JDK 8 Update 65 и Eclipse MarsПочему java.util.logging.Logger печатает в stderr?

import java.util.logging.Logger; 

public class Example { 

    private final static Logger LOGGER = Logger.getLogger(Example.class.getName()); 

    public static void main(String[] args) { 
     LOGGER.info("Test"); 
    } 

} 

Я бы ожидать, чтобы получить выход на stdout, так же, как с помощью System.out.println();.
Но вместо он получает распечатаны на stderr, что приводит к красным шрифтом на консоли Eclipse:

enter image description here

Я знаю, что я могу изменить это поведение, написав пользовательские Handler, но я хотите знать, почему вывод по умолчанию появляется на stderr вместо stdout?

Регистратор должен использовать stdout для fine + info и использовать stderr для severe уровня.

ответ

0

По умолчанию регистратор выводит записи журнала уровня INFO и выше (то есть INFO, WARNING и SEVERE) в стандартный поток ошибок (System.err).

Источник: www3.ntu.edu.sg/home/ehchua/programming/java/JavaLogging.html

+0

У вас есть источник или доказательство этого утверждения? –

+0

Извините, я должен был предоставить его в комментарии :) https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaLogging.html –

+0

Что регистратор делает, что уже известно OP, вопрос: «почему». – Tom

3

Это хорошо документированы. По умолчанию регистраторы публикуют свои обработчики родителя, рекурсивно до дерева, до тех пор, пока не будет указан другой обработчик. Вы можете перебрать обработчики родительского элемента и увидеть, что обработчик по умолчанию для регистратора родителя - ConsoleHandler, который использует System.err для публикации записей журнала.

public class Main { 
    public static void main(String[] args) { 
     Handler[] handlers = Logger.getLogger(Main.class.getName()).getParent().getHandlers(); 
     for (Handler handler : handlers) { 
      System.out.println(handler.getClass().getName()); 
     } 
    } 
} 
2

The java.util.logging API был разработан под JSR 47: Logging API Specification. Согласно журналу изменений в «Предлагаемом окончательном проекте» ConsoleHandler всегда использовал System.err. На странице JCP также указаны оригинальные авторы API, и я думаю, что только те имена действительно знают ответ на ваш вопрос.

Я бы предположил, что происхождение происходит из мышления, которое ведет к регистрации сбоев, а отчеты о сбоях направляются в System.err. Действительно, для ConsoleHandler любой уровень выше INFO должен перейти в поток ошибок, и любой уровень INFO или меньше должен выйти в поток, если вы пытаетесь сохранить прецеденты JDK до добавления API протоколирования.

Смежные вопросы