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

Clojure:在go块或线程中执行代码时,记录到控制台,clojure,core.async,Clojure,Core.async,由于许多go块同时运行,所有这些块都写入控制台,文本到达控制台时可能会变得混乱/混杂。如何避免这种情况,以便在从go块中发出输出时,在控制台中正确地跟踪输出形式?此答案使用core.async本身。以下是一次谈话: ;;;;; Logging Handler ;;;;; (def log-chan (chan)) (thread (loop [] (when-let [v (<!! log-chan)] (println v) (recur))) (pri

由于许多go块同时运行,所有这些块都写入控制台,文本到达控制台时可能会变得混乱/混杂。如何避免这种情况,以便在从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")
在另一端,像这样:

(u/log @debug (str "Asked " info-ele ", and got back: " some-return))
(defn log [debug msg] 
  (when debug (>!! log-chan msg)))

这个答案使用
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")
在另一端,像这样:

(u/log @debug (str "Asked " info-ele ", and got back: " some-return))
(defn log [debug msg] 
  (when debug (>!! log-chan msg)))

使用core.async通道序列化所有日志事件将起作用,但更标准的方法是使用类似或的日志框架。它们都是为记录来自多个线程的事件而设计的(这实际上就是从core.async go块内部记录时发生的情况)


使用core.async通道序列化所有日志事件将起作用,但更标准的方法是使用类似或的日志框架。它们都是为记录来自多个线程的事件而设计的(这实际上就是从core.async go块内部记录时发生的情况)


将其发送给进行日志记录的代理-如果我的理论知识正确,代理将其in Queuse序列化;将其发送给进行日志记录的代理-如果我的理论知识正确,代理将其in Queuther序列化多年来有很多标准Java日志记录框架。它们都需要进行配置,在正确的位置有正确的jar文件,解决它们之间的不兼容问题,完成源代码更改(有时是对每个文件)。logback或log4j?logback,尽管您将通过clojure.tools.logging使用它“logback是流行的log4j项目的继任者,从log4j停止的地方开始”。我的观点是,花一个小时左右的时间来学习日志框架及其配置是值得的,因为从长远来看,它将为您节省大量时间。使用slf4j和clojure.tools.logging,您可以交换日志实现并保留相同的源代码。它们都需要进行配置,在正确的位置有正确的jar文件,解决它们之间的不兼容问题,完成源代码更改(有时是对每个文件)。logback或log4j?logback,尽管您将通过clojure.tools.logging使用它“logback是流行的log4j项目的继任者,从log4j停止的地方开始”。我的观点是,花一个小时左右的时间来学习日志框架及其配置是值得的,因为从长远来看,它将为您节省大量时间。使用slf4j和clojure.tools.logging,您可以交换日志实现并保留相同的源代码。您甚至可以
alts
一个单独的通道,而不是atom,用于打开和关闭调试,只需将
打开
/
关闭
状态设置为循环变量。您甚至可以
alts
一个单独的通道,而不是用于打开和关闭调试的atom,只需将
打开
/
关闭
状态设置为循环变量即可。