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 ..),它将上下文映射数据直接添加到log4j2的MDC中。
tools.logging中还缺少什么吗?
是的,有一些代码路径可以访问使用slf4j Markers的方法。MDC对于结构化日志不足以满足需求。
https://stackoverflow.com/questions/4165558/best-practices-for-using-markers-in-slf4j-logback

但是MDC(Mapped Diagnostic Context)对于“切片和切块”极为有用,正如该回答所说 —— 对于我们来说,在整个请求的日志中添加用户ID、IP地址或其他类似信息的能力比能够根据不同的日志“类型”进行过滤更为重要。

因此,我认为这里的主要启示是,有些人会想要Markers,有些人会想要MDC,有些人会想两者都要,有些人可能对这两者都不关心。

Markers直接影响API,因为它们是传递给error()、warn()等调用的。鉴于c.t.l(controltraffic)已提供变长调用并将Throwable作为第一个参数的特殊情况,我不确定添加Markers的API应该是怎样的(尤其是它们是对每个记录器实现不同类的情况)?

也许可以创建errorm、warnm、infom等,把第一个参数作为Marker处理?如何将其添加到底层的write!中,而不会破坏c.t.l(controltraffic)之外的其他现有实现呢?
正如你所说,可能会需要一个新API,比如"{log}m",我会对此感到满意的。
关于write!方法,我建议增加另一个方法或参数,然后调用它。这样,不支持标记或类似功能的实现无需做出任何更改。
我正在开发一个针对log4j2的Clojure库,该库支持标记和MDC以及通过MapMessage等进行结构化日志记录:[https://github.com/seancorfield/logging4j2](https://github.com/seancorfield/logging4j2) -- 欢迎在此早期阶段提出反馈。

1 答案

0

我们已将日志记录迁移到具有标记的结构化日志,如本处所述:[https://stackoverflow.com/a/60101309/8162407](https://stackoverflow.com/a/60101309/8162407)

在clojure.tools.logging上使用了一个轻薄的包装,非常满意它。点赞。

这里是否还有对tools.logging的需求,如果有,是什么?
我们认为是否有可能让c.t.l支持在所有(Java)日志库中通用地支持上下文或标记?

我个人不确定人们多久会更改日志实现,所以我认为这并不值得。如果你已经选择了一种日志实现,你可以使用Java互操作性以任何你想要的方式使用MDC或标记...
by
你如何将与tools.logging结合使用标记?我知道MDC可以使用宏轻易实现,但我该如何动态传达标记呢?
...