【问题标题】:ErrorHandler and Log错误处理程序和日志
【发布时间】:2016-06-13 13:42:56
【问题描述】:

我想写一篇关于实现 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());

【问题讨论】:

    标签: java xml logging handler


    【解决方案1】:

    你是如何调用你的日志的?我已经复制了您的课程并且工作正常。

    然后这样调用:

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

    这会将异常写入日志文件

    【讨论】:

    • 我不明白处理程序是如何工作的。我虽然处理程序在处理错误时会自行调用日志。我把代码放在上面
    • 确实如此。我用一个记录异常的例子编辑了我的答案。也许您应该首先尝试从 main 方法调用,然后在它工作时注册为 Sax ErrorHandler。但是我要做的是为您的 Logger 创建一个类,为您的 ErrorHandler 创建另一个类并分别测试它们。
    猜你喜欢
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多