Pourquoi java.util.logging.Logger est-il imprimé sur stderr?

J’ai une configuration simple pour enregistrer un message: JDK 8 Update 65 et Eclipse Mars

 import java.util.logging.Logger; public class Example { private final static Logger LOGGER = Logger.getLogger(Example.class.getName()); public static void main(Ssortingng[] args) { LOGGER.info("Test"); } } 

Je m’attendrais à obtenir une sortie sur la sortie stdout , tout comme avec System.out.println(); .
Mais au lieu de cela, il est imprimé sur le stderr , ce qui donne une police rouge sur la console eclipse:

entrez la description de l'image ici

Je sais que je peux changer ce comportement en écrivant un Handler personnalisé, mais je souhaite savoir pourquoi la sortie par défaut apparaît sur stderr au lieu de stdout ?

Un enregistreur doit utiliser stdout pour fine + info et stderr pour severe niveaux severe .

Par défaut, l’enregistreur génère les enregistrements de journal de niveau INFO et supérieur (c’est-à-dire INFO, WARNING et SEVERE) dans le stream d’erreur standard (System.err).

Source: www3.ntu.edu.sg/home/ehchua/programming/java/JavaLogging.html

C’est bien documenté. Par défaut, les enregistreurs publient dans les gestionnaires de leurs parents, de manière récursive jusqu’à l’arborescence, jusqu’à ce que l’autre gestionnaire ait été spécifié. Vous pouvez effectuer une boucle sur les gestionnaires du parent et vérifier que le gestionnaire par défaut du consignateur du parent est ConsoleHandler, qui utilise System.err pour publier des enregistrements de journal.

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

L’ API java.util.logging a été développée sous JSR 47: Spécification de l’API de journalisation . Selon le journal des modifications de la “version finale proposée”, ConsoleHandler a toujours utilisé System.err. La page JCP répertorie également les auteurs originaux de l’API et je pense que seuls ces noms connaissent réellement la réponse à votre question.

J’imagine que l’origine provient de l’état d’esprit selon lequel la journalisation concerne les échecs de rapport et que le rapport des échecs est dirigé vers System.err. Vraiment pour ConsoleHandler, tout niveau supérieur à INFO doit aller au stream d’erreurs et tout niveau ou moins d’INFO doit aller au stream sortant si vous essayez de conserver des précédents du JDK avant l’ajout de l’API de journalisation.