pr-str还打印出跟踪消息

时间:2015-04-06 10:36:20

标签: clojure

我正在使用pr-str将EDN打印到字符串并与客户端进行通信。遇到非常有趣的行为,其中pr-str还会将printlnclojure.tools.trace/trace条消息混合到EDN字符串表示中。这是一种字符串pr-str输出:

(TRACE from-ds {:key "asdasf", :weight 0, :tag "1"} ; trace message

{:key "asdasf", :weight 0, :tag "1"}) ; the actual edn that should be the sole output

我似乎无法在REPL中重现这一点。

为什么会这样?如何解决它?

1 个答案:

答案 0 :(得分:2)

pr-str使用with-out-str,它捕获在其块内部发生的任何打印输出,并将其转换为返回的字符串。

with-out-str创建*out*的线程局部绑定。因此,只有在pr-str调用中的代码记录时,才能在输出字符串中获取日志输出的唯一方法。这可以通过在pr-str调用之外绑定值然后在该值上调用pr-str来修复。

例如

(let [the-value (generate-some-value) ; this prints something
      value-string (pr-str the-value)] ; this doesn't have trace output
  ...)