2015-12-08 16 views
6

Ho una semplice impostazione per registrare un messaggio: JDK 8 Update 65 e Eclipse MarsPerché java.util.logging.Logger stampa su 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"); 
    } 

} 

mi aspetto di ottenere un output sul stdout, proprio come con System.out.println();.
Ma invece ottiene stampato sul stderr, che si traduce in un carattere di colore rosso sulla console di Eclipse:

enter image description here

So che posso cambiare questo comportamento scrivendo una consuetudine Handler, ma io desideri sapere perché l'output predefinito viene visualizzato su stderr anziché su stdout?

Un registratore deve utilizzare stdout per fine + info e utilizzare stderr per severe livello.

risposta

0

Per impostazione predefinita, il registratore emette i record di registro di livello INFO e superiori (ad esempio INFO, WARNING e SEVERE) al flusso di errore standard (System.err).

Fonte

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

+0

Hai una fonte o una prova per questa affermazione? –

+0

Spiacente, avrei dovuto fornirlo nel commento :) https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaLogging.html –

+0

Che il logger faccia già questo è noto con OP, il la domanda è: "perché". – Tom

3

E 'ben documentato. Per impostazione predefinita, i logger pubblicano i gestori dei loro genitori, in modo ricorsivo fino all'albero, fino a quando non viene specificato l'altro gestore. È possibile eseguire il looping sui gestori del genitore e verificare che il gestore predefinito del registratore del genitore sia ConsoleHandler che utilizza System.err per pubblicare i record del registro.

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

Il java.util.logging API è stato sviluppato sotto JSR 47: Logging API Specification. In base al registro delle modifiche nella "Proposta di bozza finale", ConsoleHandler ha sempre utilizzato System.err. La pagina JCP elenca anche gli autori originali dell'API e penso che solo quei nomi conoscano veramente la risposta alla tua domanda.

Immagino che l'origine derivi dal fatto che la registrazione è per la segnalazione di errori e la segnalazione degli errori viene indirizzata a System.err. Davvero per ConsoleHandler, qualsiasi livello sopra INFO dovrebbe andare a flusso di errori e qualsiasi livello INFO o meno dovrebbe andare a uscire dal flusso se si sta tentando di mantenere i precedenti di JDK prima dell'aggiunta dell'API di registrazione.

Problemi correlati