我正在使用 Saxon 9 在 Java 中执行 XSL 转换。如果在转换过程中出现错误,Saxon 会将输出定向到运行它的 JVM 的标准错误流。我的 Java 应用程序具有标准输出和错误的日志记录机制。如何强制 Saxon 使用我的错误输出流而不是 JVM 默认错误输出流?
问问题
1942 次
1 回答
5
Saxon 将错误转移到javax.xml.transform.ErrorListener对象。最初,这些对象中有一个将异常写入 stderr 的默认对象,但您可以轻松创建一个新的 ErrorListener 对象并实现其warning
、error
和fatalError
方法,以将它们发送到您的自定义日志记录机制。
如何设置新的 ErrorListener 取决于您使用的是 JAXP 接口还是 s9api 接口。对于 JAXP 接口,您可以调用setErrorListener
Transformer 对象。对于 s9api 接口,setErrorListener
您可以在创建处理器时提供配置对象上的方法,或者在 XsltCompiler 对象上或 XsltTransformer 对象上提供方法。反正周围有好几个。
像这样的东西(s9api):
final PrintStream logFile =
new java.io.PrintStream("errorlog.txt"); // for example
Configuration configuration = new Configuration();
configuration.setErrorListener(new ErrorListener() {
@Override
public void warning(TransformerException exception) throws TransformerException {
exception.printStackTrace(logFile); // or wherever
}
@Override
public void error(TransformerException exception) throws TransformerException {
exception.printStackTrace(logFile);
}
@Override
public void fatalError(TransformerException exception) throws TransformerException {
exception.printStackTrace(logFile);
}
});
Processor proc = new Processor(configuration);
...
如果您不想对程序中的任何内容使用 stderr,最好使用System.setErr在程序范围内重定向它:
System.setErr(new java.io.PrintStream("errorlog.txt"));
它需要一个PrintStream对象,您可以将其包装在任何类型的输出/流中,因此我确信它可以适用于您的自定义日志记录机制。
于 2013-03-13T23:24:00.573 回答