我正在使用Saxon 9在Java中执行XSL转换。如果在转换期间出现错误,Saxon会将输出定向到运行它的JVM的标准错误流。我的Java应用程序具有标准输出和错误的日志记录机制。如何强制Saxon使用我的错误输出流而不是JVM默认错误输出流?
答案 0 :(得分:3)
Saxon将错误转移到javax.xml.transform.ErrorListener对象。最初这些对象的默认值是将异常写入stderr,但是您可以轻松地创建新的ErrorListener对象并实现其warning
,error
和fatalError
方法,以将它们发送到您的自定义日志记录机制。
如何设置新的ErrorListener取决于whether you are using the JAXP interface or the s9api interface。对于JAXP接口,您可以在Transformer对象上调用setErrorListener
。对于s9api接口,在创建处理器或XsltCompiler对象或XsltTransformer对象时可以提供的Configuration对象上有setErrorListener
方法。无论如何,他们周围有好几个。
像这样的东西(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对象,您可以将其包裹在任何类型的输出/流中,因此我确信它可以用于您的自定义日志记录机制。