请在2024 Clojure 现状调查!中分享您的想法。

欢迎!请参阅关于页面了解有关如何使用此功能的更多信息。

0
tools.logging
log/info 去除了字符串中的引号,使得调试比原本需要的更加困难。我发现{:test1 "", :test2 "2"} 被记录为{:test1  , :test2 2}。当我使用 println 打印 map 时,我看到相同的问题。prn 以带引号的形式打印 map,这对调试更有用。

我将在稍后制作一个补丁并添加它。

7 个答案

0

评论者:llsouder

在 0.4.0 版本中重新测试

user=> (log/info ["test" "1" "" "3"]) Jul 23, 2017 8:22:56 AM user invoke INFO: [test 1 3] user=> (log/info ":one" :one 1 "1") Jul 23, 2017 8:35:30 AM user invoke INFO: :one :one 1 1

输出应该是

INFO: ["test" "1" "" "3"]

还有

INFO: [":one" :one 1 "1"]

0

评论者:llsouder

将 print-str 替换为 prn-str,以便用户能够看到将被评估的内容。这在调试程序中很有用,但我可以想象这可能会弄乱野外的人类可读信息输出。

0

评论者:tangrammer

大家好,我可以在我的应用程序代码中添加一个覆盖打印方法的String类型来避免这个令人讨厌的问题…这是一个方便的方法吗?

`
(defmethod clojure.core/print-method String

 [s ^java.io.Writer writer]

(.write writer (str "\"" s "\"")))
`

0

评论者:ilmoraunio

附上一个替代的修复方案,是针对已经提出的TLOG20.patch,我们在这里使用pr-str代替。这个更改集允许在复制粘贴到REPL(例如)中时,让记录的Clojure代码符合编译器的规则。这个更改集影响了logp及其变体。

这个修复对于更轻松地调试生产问题是必要的,尤其是在Clojure数据实体太大而无法手动插入引号时。

0
评论者:ataggart_

尽管提供了示例,但许多现实世界的日志条目不仅包含结构化数据,还包含人类可读的解释性文本。因此,始终使用`pr-str`会发出不需要引号和转义字符,并且没有方法可以解决(与通过手动用`pr-str`包装值来解决当前问题的方式不同)。这种破坏性的更改是不可接受的。

话说回来,添加处理这种常见摩擦点的新宏可能是合理的。

`logp`的变体是有问题的,因为在最常见的文本和数据混合的案例中,我们无法确定用户打算如何处理哪个参数。

`logf`的变体可能有效,其中所有格式参数都通过`pr-str`映射,而解释性文本则位于格式字符串中。
0
参考: https://clojure.atlassian.net/browse/TLOG-20(由llsouder报告)
...