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。
我更愿意使用标记(Markers)而不是 MDC,在这里调用所有方法。
https://www.slf4j.org/api/org/slf4j/Logger.html#error-org.slf4j.Marker-java.lang.String-java.lang.Throwable-
tools.logging中还需要些什么吗?
是的,有一些代码路径可以到达使用slf4j的Marker的方法。对于结构化日志,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) —— 在这个早期阶段,我很乐意接受反馈。

1 个答案

0

我们移植到了具有标记的结构化日志,正如这里所写:[链接](https://stackoverflow.com/a/60101309/8162407)

在clojure.tools.logging的基础上添加了一个薄薄的包装器,非常满意。点赞。

在这里还有工具.logging的需求吗?如果有,是什么?
我认为这是一个问题:c.t.l是否能够支持跨所有(Java)日志库的通用的上下文或标记?

个人而言,我不确定人们更改日志实施频率有多高,因此我认为这样做不值得。如果你已经选择了一个日志实施方案,你可以使用Java互操作工具以任何方式使用MDC或标记...
如何在tools.logging工具联合中使用标记呢?我知道MDC可以通过宏轻松完成,但我该如何动态传达标记呢?
...