ErrorHandler和Log

时间:2016-06-13 13:42:57

标签: java xml logging handler

我想写一个关于实现ErrorHandler的Java类的日志。我的类用于处理来自读取xml文件的错误。 我在网站上尽我所能,但我不明白为什么这段代码会将日志文件留空。 此外,我不明白如何在我的应用程序中管理记录器。什么是最佳做法?你建议只有一个日志文件或更多?我将不得不记录多个错误处理程序:您是否建议将所有日志代码放入错误处理程序类?我应该为洞穴应用程序实现记录器吗?

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

1 个答案:

答案 0 :(得分: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);  

这会将异常写入日志文件