2016-04-16 20 views
0

Dieses Protokollierungsmodul einfach in den Griff bekommen.java.util.logging: Wohin geht die Handler-Ausgabe, wenn sie von Windows aus ausgeführt wird?

Wenn ich es in Eclipse ausführen, geht die Konsolenausgabe dahin, wo ich erwarte: Konsolenhandler zu Konsole, Dateihandler zu Datei.

Wenn ich von der Eingabeaufforderung laufen habe ich keine Ahnung, wo die Konsolenausgabe oder die Dateiausgabe geht. Diese

ist, wie ich es konfigurieren:

Handler consoleHandler = null; 
    Handler fileHandler = null; 
    try { 
     logger.setUseParentHandlers(false); 

     // Creating consoleHandler and fileHandler 
     consoleHandler = new DualConsoleHandler(); 

     // 1000 bytes max, 5 files max, append mode = true 
     fileHandler = new FileHandler("./output/logging/log%g.xml", 10000, 5, true); 

     // Assigning handlers to logger object 
     logger.addHandler(consoleHandler); 
     logger.addHandler(fileHandler); 

     // Setting levels to handlers and logger 
     consoleHandler.setLevel(Level.ALL); 
     fileHandler.setLevel(Level.ALL); 

     logger.setLevel(Level.ALL); 
    } catch (IOException exception) { 
     logger.log(Level.SEVERE, "Error occur in FileHandler.", exception); 
    } 

Die DualConsoleHandler sieht wie folgt aus (in einem anderen SO Frage gefunden), die Idee INFO zu drucken ist oder niedriger stdout, aber WARNUNG oder höher stderr:

public class DualConsoleHandler extends StreamHandler { 

    private final ConsoleHandler stderrHandler = new ConsoleHandler(); 

    public DualConsoleHandler() { 
     super(System.out, new SimpleFormatter()); 
    } 

    @Override 
    public void publish(LogRecord record) { 
     if (record.getLevel().intValue() <= Level.INFO.intValue()) { 
      super.publish(record); 
      super.flush(); 
     } else { 
      stderrHandler.publish(record); 
      stderrHandler.flush(); 
     } 
    } 
} 
+0

Ihr DualConsoleHandler-Code wird den Standard schließen. Überschreiben Sie 'close' und die Implementierung sollte' this.flush(); stderrHandler.close(); ' – jmehrens

Antwort

1

Wenn ich von der Eingabeaufforderung habe ich keine Ahnung, wo die Ausgabe der Konsole oder die Dateiausgabe wird.

Die Konsolenausgabe wird an die Konsole gesendet.

Die Dateiausgabe wird an den Pfad übergeben, den Sie angegeben haben. d. h. ./output/logging/log%g.xml

Suchen Sie im Verzeichnis, unter dem Sie es für ein Verzeichnis output/logging ausgeführt haben.

+0

Danke, aber keine Ausgabe wird zu diesen Orten: die Konsole (Eingabeaufforderung) zeigt nur den Befehl zum Ausführen der App, d. h." java -cp xxxx App "... mit nichts darunter. Und unter output \ logging \ gibt es in dem Verzeichnis, in dem es ausgeführt wird, keine Aktivität zum Schreiben von Dateien. Ehrlich gesagt, ich müsste wirklich noch dümmer sein als ich, um diese Frage zu stellen, wenn die Antwort so einfach wäre ... –

+0

@mikerodent in diesem Fall ist Ihre Erwartung, was es tun soll, richtig, vielleicht die Frage sollte sein; Warum schreibt es nicht wie erwartet in die Konsole oder Datei? –

+0

@mikerodent Ich würde ein viel einfacheres Beispiel, z.B. Funktioniert System.out.println? macht eine viel einfachere Appenderarbeit? Erwartet der Appender, dass das Verzeichnis existiert? –