【问题标题】:How can I disable the strerr logging output from FOP?如何禁用 FOP 的 strerr 日志输出?
【发布时间】:2010-03-31 13:18:40
【问题描述】:

如何禁用 FOP 在处理 FO 文件时自动生成的日志输出(通常发送到 stderr)?

我尝试将log4j.properties 文件放在类路径中,更改org.apache.fop 的日志级别,但这没有奏效。

【问题讨论】:

    标签: java apache-fop


    【解决方案1】:

    这可能晚了,但在 1.1 版中,您可以创建一个实现 EventListener 的类。在processEvent 中,您可以简单地忽略任何您不想看到的消息。

    来自FOP Docs

    import org.apache.fop.events.Event;
    import org.apache.fop.events.EventFormatter;
    import org.apache.fop.events.EventListener;
    import org.apache.fop.events.model.EventSeverity;
    
    /** A simple event listener that writes the events to stdout and stderr. */
    public class SysOutEventListener implements EventListener {
    
        /** {@inheritDoc} */
        public void processEvent(Event event) {
            String msg = EventFormatter.format(event);
            EventSeverity severity = event.getSeverity();
            if (severity == EventSeverity.INFO) {
                System.out.println("[INFO ] " + msg);
            } else if (severity == EventSeverity.WARN) {
                System.out.println("[WARN ] " + msg);
            } else if (severity == EventSeverity.ERROR) {
                System.err.println("[ERROR] " + msg);
            } else if (severity == EventSeverity.FATAL) {
                System.err.println("[FATAL] " + msg);
            } else {
                assert false;
            }
        }
    }
    

    用法:

    StreamSource strm = new StreamSource(new File(fo));
    OutputStream outStream = new BufferedOutputStream(new FileOutputStream(new File(pdfName)));
    Fop fop = _fopFactory.newFop(org.apache.xmlgraphics.util.MimeConstants.__Fields.MIME_PDF, outStream);
    FOUserAgent foUserAgent = fop.getUserAgent();
    foUserAgent.getEventBroadcaster().addEventListener(new SysOutEventListener());
    

    【讨论】:

      【解决方案2】:

      我在 fop 文档中发现了一个提示:http://xmlgraphics.apache.org/fop/0.95/embedding.html#basic-logging 说“我们已将 [...] 切换到 Jakarta Commons Logging”。您的 log4j.properties 可能没有任何效果,因为他们正在使用公共日志记录。

      这适用于我的情况:

      <logger name="org.apache.fop">
          <level value="info" />
          <appender-ref ref="logfile" />
          <appender-ref ref="stdout" />
      </logger>
      

      检查你的commons日志配置,发现进程是否能找到log4j( http://commons.apache.org/logging/guide.html#Configuration)

      【讨论】:

        【解决方案3】:

        你可以这样做:

        org.apache.commons.logging.impl.Log4JLogger log = (org.apache.commons.logging.impl.Log4JLogger) LogFactory.getLog("org.apache.fop");
        
        log.getLogger().setLevel(org.apache.log4j.Level.FATAL);
        

        【讨论】:

        • 为我工作。 +1 包括完全限定的类名。
        【解决方案4】:

        不知道 FOP,但您始终可以使用以下代码将 STDERR 重定向到您喜欢的任何位置:

        File errDumpFile = new File("Path\to\a\File")
        FileOutputStream fos = new FileOutputStream(errDumpFile);
        PrintStream ps = new PrintStream(fos);
        System.setErr(ps);
        

        注意:您不必重定向到文件,PrintStream 可以采用任何 OutputStream

        【讨论】:

          猜你喜欢
          • 2013-07-25
          • 1970-01-01
          • 1970-01-01
          • 2016-09-24
          • 2020-05-07
          • 2013-11-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多