2024 Clojure状态调查!中分享您的想法。

欢迎使用!有关此服务的更多信息,请参阅关于页。

+4
Java互操作

结构化日志优于纯文本。
上下文日志加结构化日志是一种净收益。在我们的工作场所,我们可以淘汰我们的临时日志解决方案,除了支持上下文日志外,工具.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。
我更愿意使用Marker而不是MDC,并调用这里的所有方法。
https://www.slf4j.org/api/org/slf4j/Logger.html#error-org.slf4j.Marker-java.lang.String-java.lang.Throwable-
在 tools.logging 中还需要增加些什么吗?
是的,有一些代码路径可以到达接收 slf4j 标记的方法。MDC 对于结构化日志记录是不够的。
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! 调用中?
很可能需要一个新的 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,但如何动态地传达标记呢?
...