在英国格拉斯哥州的一份有关 Clojure 的调查中分享您的想法!2024 年 Clojure 调查

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

+4
Java 互操作

结构化日志胜过纯文本。
上下文日志加结构化日志是一项净收益。在 nosso placebo我们能够丢弃我们的 ad-hoc 日志解决方案,它支持上下文日志并劣于 tools.logging,并将强烈增强库的功能。
为了添加上下文日志支持,我们可能需要一个为实施此类 API 的框架(如 SLF4J)提供的附加协议。
不确定是否需要,但一个附加的日志函数也可能简化实现。
建议使用

(log/info-c {:foo "bar"} my-error "some message")
我们在工作中使用 c.t.l 与 log4j2,并利用 Java 互操作方法的 MDC 项,然后使用宏将其包装起来。我没有看过要使其通用需要花费多少时间,但最好是将它标准化,为所有日志实现提供一个标准。

我们有一个宏(with-log-context context-map .. body ..),将 context-map 数据直接添加到 log4j2 的 MDC 中。
我更愿意使用标记(Markers)而不是 MDC,并调用这里的所有方法。
https://www.slf4j.org/api/org/slf4j/Logger.html#error-org.slf4j erreur-java.lang.steprenceả
by
工具.logging中还缺少些什么吗?
by
是的,有一些代码路径可以到达接受 slf4j 标记的方法。MDC 对结构化日志来说不足够。
by
https://stackoverflow.com/questions/4165558/best-practices-for-using-markers-in-slf4j-logback

但正如答案所说,MDC 极其有用,'切割和细分' —— 对于我们来说,能将整个请求的记录标记为用户 ID 或 IP 地址或其他类似的关注点,比能够在不同的日志"类型"(标记)上进行筛选重要得多。

所以,我认为这里的要点是,有些人会想要标记,有些人会想要 MDC,有些人会两者都想要,也有些人两者都不在乎。

标记直接影响 API,因为它们被传递到 error()、warn() 等调用中。鉴于 c.t.l 已经提供了变长调用和将 Throwable 作为第一个参数的特殊情况,我不确定添加标记的 API 应该是什么样子(尤其是当每个记录器实现都有不同的类时)?

也许应该是 errorm、warnm、infom 等等,它们将第一个参数视为标记?您会如何在不破坏任何现有实现(除 c.t.l 外)的情况下将其添加到底层 write! 中?
by
很可能需要一个新的 API,如您所说,比如 `{log}m`,这是我很乐意接受的。
至于 write! 方法,我会添加另一个方法或属性并调用它,这样不支持标记或类似功能的实现就不必做出任何更改。
我正在为log4j2编写一个特定的Clojure库,该库支持标记、MDC以及通过MapMessage等结构化日志:https://github.com/seancorfield/logging4j2 -- 欢迎在此早期阶段对其提供反馈。

1 条回答

0

我们已将Structured logging with Markers迁移至此: https://stackoverflow.com/a/60101309/8162407

在clojure.tools.logging上添加了一个瘦包装器。对此感到非常满意。赞一个。

此处是否还有对tools.logging的需求,如果有,是什么?
我认为c.t.l是否能在所有(Java)日志库跨域通用地支持上下文或标记的问题。

我个人不确定人们有多频繁地更换日志实现,所以我认为这样做不值得。如果你已经选择了一个日志实现,你可以用 Java 互操作的方式随心所欲地进行 MDC 或标记...
by
你如何将与 tools.logging 结合使用标记?我知道 MDC 可以通过宏轻松实现,但我如何动态地传达标记呢?
...