如何在Java中更改Saxon的标准错误输出流?

时间:2013-03-13 21:02:07

标签: java stream saxon

我正在使用Saxon 9在Java中执行XSL转换。如果在转换期间出现错误,Saxon会将输出定向到运行它的JVM的标准错误流。我的Java应用程序具有标准输出和错误的日志记录机制。如何强制Saxon使用我的错误输出流而不是JVM默认错误输出流?

1 个答案:

答案 0 :(得分:3)

Saxon将错误转移到javax.xml.transform.ErrorListener对象。最初这些对象的默认值是将异常写入stderr,但是您可以轻松地创建新的ErrorListener对象并实现其warningerrorfatalError方法,以将它们发送到您的自定义日志记录机制。

如何设置新的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对象,您可以将其包裹在任何类型的输出/流中,因此我确信它可以用于您的自定义日志记录机制。