请在 2024 年 Clojure 状态调查中分享您的看法!

欢迎!请参阅关于页面了解此功能的一些更多信息。

+4
Java 互操作

结构化日志胜过纯文本。
上下文日志加结构化日志是一个净收益。在我的工作场所,我们可以丢弃我们的临时代码日志解决方案,该解决方案除了支持上下文日志外,还比 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 中。
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
正如您所说,可能会需要一个带有{log}m的新API,我很高兴。
关于write!方法,我建议添加另一个方法或额外的参数并在其中调用它,这样不支持标记或不支持类似功能的实现就不需要进行更改。
我正在开发一个针对log4j2的Clojure库,该库支持标记和MDC以及通过MapMessage等实现结构化日志: https://github.com/seancorfield/logging4j2 -- 欢迎在此早期阶段提供反馈。

1 个答案

0

我们已将结构化日志与标记迁移到strcutrued logging,如我在此处所写:https://stackoverflow.com/a/60101309/8162407

在clojure.tools.logging的基础上提供了一个轻量级包装。对此非常满意。点赞。

此处是否仍有针对tools.logging的需求,如果有,是怎样的需求呢?
我认为是否有这样一个问题:c.t.l 是否能够在所有(Java)日志库中通用支持上下文或标记?

我个人并不确定人们有多少次会改变日志实现,因此我不认为这很有价值。如果您已经选择了一个日志实现,那么您可以使用Java互操作方式随心所欲地使用MDC或标记...
by
如何在与 tools.logging 结合使用时使用标记?我知道可以通过宏轻松完成MDC,但如何动态传达标记呢?
...