如何使用core.async写入Clojure中的日志文件?

时间:2014-05-12 02:56:51

标签: logging asynchronous clojure java-io core.async

我想使用core.async作为写入文件的记录器,因此我创建了一个test.txt文件,将其粘贴在我的资源文件夹中并编写了此代码:

(use 'clojure.java.io)
(use 'clojure.core.async)

(def print-chan (chan))

(go (loop []
      (when-let [v (<! print-chan)]
        (with-open [wrtr (writer "resources/test.txt" :append true)]
          (.write wrtr v))
        (recur)))) 

(>!! print-chan 42)

然而,当我运行它时,我发现它只会替换文件中的内容,而不会附加到文件中。此外,有时写入文件的输出是奇数。有一次,我试图把42和我得到*。当我使用没有core.async函数的编写器时,它按预期工作。使用core.async在Clojure中写入日志文件的惯用方法是什么?提前致谢!

*我正在使用灯桌。

1 个答案:

答案 0 :(得分:4)

wrtrjava.io.BufferedWriter

当您将42(长)发送到频道时,您正在调用(.write wrtr 42)来调用此方法:

write(int c)
Writes a single character.

42代表ASCII table上的\*字符,这就是正在编写的内容。

相反,您希望通过(.write wrtr "42")

调用此Writer方法
write(String str)
Writes a string.

您可以通过将从通道读取的值转换为字符串来实现:

(.write wrtr (str v))