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

欢迎!请查看关于页面以获取更多有关此工作方式的信息。

+4
Java Interop

结构化日志优于纯文本。
上下文日志加结构化日志是一个净收益。在我的公司,我们可以丢弃我们的临时日志解决方案,它除了支持上下文日志之外,在工具.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中。
在 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 以外)的情况下将此添加到基本的写入操作中!?
正如您所说,可能需要一个像 `{log}m` 这样的新 API,我很乐意接受。
关于 write! 方法,我会添加另一个方法或参数,并调用它,这样不支持标记或其他等效功能的应用程序不需要做出任何更改。



你如何在与 tools.logging 结合使用时使用标记?我知道 MDC 可以通过宏轻松完成,但如何动态地传达标记?
...