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

标签 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 中写入日志文件的惯用方法是什么?提前致谢!

*我正在使用照光台。

最佳答案

wrtrjava.io.BufferedWriter .

当您将 42(长整型)发送到 channel 时,您将调用 (.write wrtr 42) 来调用此方法:

write(int c)
Writes a single character.

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

相反,您希望通过 (.write wrtr "42") 调用此 Writer 方法:

write(String str)
Writes a string.

您可以通过将从 channel 读取的值转换为字符串来做到这一点:

(.write wrtr (str v))

关于logging - 如何使用 core.async 在 Clojure 中写入日志文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23600387/

相关文章:

ios - 使用 Swift 的 Lumberjack 2.0 记录器

python请求模块记录编码

java - 我的代码中有一个第三方异步 block 。我怎么知道它什么时候结束?

function - Clojure 函数的更惯用和优雅的方式

clojure - 如何将导入添加到 "eval"ed 的 clojure 代码中?

django-cms 拒绝在生产中发布特定页面 - 我应该从哪里开始调试?

ios - 如何以编程方式获取 iOS 应用程序中的日志消息?

java - 为什么 AsyncHttpClient 在抛出异常后不关闭线程?

ios - Swift - 来自 URLSession 任务的 TableView 数据源

clojure 对性能不佳的代码的性能