Clojure中stdout的逐行捕获

问题描述 投票:2回答:1

我有一些代码(我无法修改),可以在几秒钟的时间内调用各种AP​​I端点,并在每一步将信息行打印到stdout。我想将打印到stdout的行重定向到自定义日志功能。

[通常,如果我被迫调用我无法控制的stdout-write副作用的代码,则可以将其包装在对with-out-str的调用中。在这种情况下,我正在寻找一种解决方案,该解决方案允许我拦截打印的每一行when,而不是在函数完成之后(这是with-out-str允许我执行的操作)。

是否有一种惯用的方式来执行此操作,也许某种java.io.Writer在刷新每一行时会调用回调?

我正在寻找这样的东西:

(defn slowly-print-many-lines []
  (dotimes [i 10]
    (println "Printing line number" (inc i))
    (Thread/sleep 1000)))


(let [on-line-printed (fn [printed-line]
                        (my-logger/info printed-line))]
  (binding [*out* (callback-writer on-line-printed)]
    (slowly-print-many-lines)))

我有一些代码(我无法修改),可以在几秒钟的时间内调用各种AP​​I端点,并在每一步将信息行打印到stdout。我想重定向...

logging clojure stdout
1个回答
1
投票

您必须编写自己的PrintStream包装类,然后使用java.lang.System/setOutsetErr重新分配System.outSystem.err的值。

© www.soinside.com 2019 - 2024. All rights reserved.