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 调用 INFO: [test 1 3] user=> (log/info ":one" :one 1 "1") Jul 23, 2017 8:35:30 AM user 调用 INFO: :one :one 1 1

输出应该是

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

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

0

评论者:llsouder

用 prn-str 替换 print-str,以便用户可以看到将被求值的内容。这在调试程序时很有用,但我也理解这可能会搞乱野外可读的信息输出。

0

评论者:tangrammer

大家好,我可以在我的应用程序代码中添加针对 String 类型的 print-method 重写,以避免这个问题……这是一个方便的方法吗?

`
(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 报告)
...