2016-06-13 79 views
0

我想編寫一個關於實現ErrorHandler的Java類的日誌。我的類用於處理來自讀取xml文件的錯誤。 我盡我所能在網站上看,但我不明白爲什麼這段代碼是空的日誌文件。 此外我不明白如何在我的應用程序中管理記錄器。最佳做法是什麼?你建議只有一個日誌文件或更多?我將不得不記錄多個錯誤處理程序:您是否建議將所有日誌代碼放入錯誤處理程序類中?我應該爲孔應用程序實施記錄器嗎?ErrorHandler和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); 
    } 

} 

編輯: 我要做的初始化日誌:

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

回答

0

你是如何調用你的日誌?我已經複製了你的班級並且工作正常。

,然後調用這種方式:

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);   
    } 

輸出:

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 

註冊類的處理程序我做到這一點:

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

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

此寫入例外日誌文件

+0

我不明白處理程序如何工作。我雖然處理程序會在處理錯誤時自行調用日誌。我把上面的代碼 – user1315621

+0

它當然會。我用一個記錄異常的例子編輯我的答案。也許你應該嘗試首先從主要方法中調用,並在工作時註冊爲Sax ErrorHandler。然而,我會做的是爲您的記錄器和另一個爲您的ErrorHandler創建一個類,並單獨測試它們。 –