2016-06-13 9 views
0

Ich möchte ein Protokoll über eine Java-Klasse schreiben, die ErrorHandler implementiert. Meine Klasse wird verwendet, um die Fehler zu behandeln, die beim Lesen einer XML-Datei auftreten. Ich versuche mein Bestes auf der Website, aber ich verstehe nicht, warum dieser Code die Protokolldateien leer lässt. Außerdem verstehe ich nicht, wie man den Logger in meiner Anwendung verwaltet. Was sind die besten Praktiken? Schlägst du vor, nur eine Protokolldatei oder mehr zu haben? Ich muss mehr als einen Fehlerhandler protokollieren: schlagen Sie vor, den gesamten Log-Code in die Klasse "errorhandler" zu legen? Sollte ich einen Logger für die Hole App implementieren?ErrorHandler und Log

import java.io.IOException; 
import java.util.logging.FileHandler; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import java.util.logging.SimpleFormatter; 

import org.xml.sax.ErrorHandler; 
import org.xml.sax.SAXParseException; 

class XmlErrorHandler implements ErrorHandler { 

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

    FileHandler fileHandler; 

    public XmlErrorHandler() { 
     try { 

      fileHandler = new FileHandler("./xml.log"); 
      LOGGER.addHandler(fileHandler); 

      SimpleFormatter formatter = new SimpleFormatter(); 
      fileHandler.setFormatter(formatter); 


     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }  
    } 

    public void error(SAXParseException e) { 
     log(Level.SEVERE, "Error", e); 
    } 

    public void fatalError(SAXParseException e) { 
     log(Level.SEVERE, "Fatal Error", e); 
    } 

    public void warning(SAXParseException e) { 
     log(Level.WARNING, "Warning", e); 
    } 

    private void log(Level level, String message, SAXParseException e) { 
     int line = e.getLineNumber(); 
     int col = e.getColumnNumber(); 
     String publicId = e.getPublicId(); 
     String systemId = e.getSystemId(); 

     message = message + ": " + e.getMessage() + ": line=" + line + ", col=" + col + ", PUBLIC=" + publicId 
       + ", SYSTEM=" + systemId; 

     LOGGER.log(level, message); 
    } 

} 

EDIT: Alles, was ich das Protokoll zu initialisieren tun ist:

DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); 
documentBuilder.setErrorHandler(new XmlErrorHandler()); 

Antwort

0

Wie werden Sie Ihre Log-Aufruf? Ich habe deine Klasse kopiert und funktioniert gut.

Und dann auf diese Weise aufrufen:

public static void main(String[] args) { 

     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder documentBuilder = factory.newDocumentBuilder(); 
     documentBuilder.setErrorHandler(xmlErrorHandler); 

     File f = new File("bad.xml");   
     document = documentBuilder.parse(f);   
    } 

Der Ausgang:

jun 13, 2016 5:45:46 PM es.test.XmlErrorHandler log 
INFORMACIÓN: message 1 
jun 13, 2016 5:45:46 PM es.test.XmlErrorHandler log 
GRAVE: message 2 
jun 13, 2016 5:45:46 PM es.test.XmlErrorHandler log 
ADVERTENCIA: message 3 

Um die Klasse als Handler registrieren ich das tun:

  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder documentBuilder = factory.newDocumentBuilder(); 
      documentBuilder.setErrorHandler(xmlErrorHandler); 

      File f = new File("bad.xml");   
      document = documentBuilder.parse(f); 

Dies schreibt die Ausnahme die Log-Datei

+0

Ich verstehe nicht wie der Handler arbeitet. Ich möchte, dass der Handler das Protokoll selbst aufruft, wenn es einen Fehler behandelt. Ich setze über den Code – user1315621

+0

Es tut es sicherlich. Ich habe meine Antwort mit einem Beispiel bearbeitet, das eine Ausnahme protokolliert. Vielleicht sollten Sie versuchen, zuerst von einer Hauptmethode aufzurufen, und wenn es funktioniert, registrieren Sie sich als Sax ErrorHandler. Allerdings würde ich eine Klasse für Ihren Logger und eine andere für Ihren ErrorHandler erstellen und sie separat testen. –

Verwandte Themen