Clojure:在 go 块或线程中执行代码时记录到控制台

Clojure: log to console when code is being executed in a go block or thread

随着许多 go 块同时运行,全部写入控制台,文本到达控制台时可以获得 jumbled/intermingled。如何避免这种情况,以便当输出从 go 块内发出时,在控制台中按照预期正确地跟踪输出形式?

这个答案使用 core.async 本身。以下来自演讲:

;;;;; Logging Handler ;;;;;

(def log-chan (chan))

(thread
 (loop []
   (when-let [v (<!! log-chan)]
     (println v)
     (recur)))
 (println "Log Closed"))


(close! log-chan)

(defn log [msg]
  (>!! log-chan msg))

(log "foo")

代码逐字复制自 here

Timothy Balridge 的演讲是 here

我有一个 atom 用于打开和关闭调试。准确地说,显示的消息是这样的:

(u/log @debug (str "Asked " info-ele ", and got back: " some-return))

另一端是这样的:

(defn log [debug msg] 
  (when debug (>!! log-chan msg)))

使用 core.async 通道序列化所有日志记录事件是可行的,但更标准的方法是使用像 logback or log4j 这样的日志记录框架。它们都是为记录来自多个线程的事件而设计的(这实际上是从 core.async go 块内部记录时发生的事情)。

Best practices for Java logging from multiple threads?