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?
随着许多 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?