我想写一个关于实现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());
答案 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);
这会将异常写入日志文件