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

欢迎!请查看关于页面以了解更多有关如何使用本网站的信息。

+1
tools.logging

我正在调用使用clojure.tools.logging的代码,并产生了大量的INFO级别日志消息。

  • 是不是可以程序化地(也就是说,不是从某个配置文件),并且从外部抑制这些消息,直到调用这段代码的结束?

如果可能,我更希望不需要了解正在运行的是哪个日志厂?等等...

在其他项目中,使用taoensso.timbre,我成功地使用with-level宏来完成类似的事情。

提前感谢你抽出宝贵时间和思考!

1 答案

+3

已被选中
 
最佳答案

如果你想简单地禁用特定调用中发生的所有日志记录,你可以告诉tools.logging使用提供的disabled-logger-factory

(require '[clojure.tools.logging :as log]
         '[clojure.tools.logging.impl :as log-impl])

(binding [log/*logger-factory* log-impl/disabled-logger-factory]
  (call-to-noisy-lib))

如果你想要根据消息的来源命名空间丢弃消息,
你可以创建自己的LoggerFactory

(def default-factory (log-impl/find-factory))

(def custom-factory
  (reify log-impl/LoggerFactory
    (name [_factory]
      "some.arbitrary.name.for.this.factory")
    (get-logger [factory logger-ns]
      (if (= "namespace.you.want.to.silence" (str logger-ns))
        log-impl/disabled-logger
        (log-impl/get-logger default-factory logger-ns)))))

(binding [log/*logger-factory* custom-factory]
  (call-to-noisy-lib))

如果你想根据消息的级别进行过滤,
你还需要实现一个自定义的记录器。

(defn logger-with-levels [wrapped-logger allowed-levels]
  (reify log-impl/logger
    (enabled? [logger level]
      (when (contains? allowed-levels level)
        (log-impl/enabled? wrapped-logger level)))
    (write! [logger level throwable message]
      (when (contains? allowed-levels level)
        (log-impl/write! wrapped-logger level throwable message)))))

(def custom-factory
  (reify log-impl/LoggerFactory
    (name [_factory]
      "some.arbitrary.name.for.this.factory")
    (get-logger [factory logger-ns]
      (if (= "namespace.you.want.to.silence" (str logger-ns))
        (logger-with-levels (log-impl/get-logger default-factory logger-ns) #{:warn})
        (log-impl/get-logger default-factory logger-ns)))))

这里还有提升、润色和优化的空间,但是看起来所有的必要部分都已经可用,以实现所需的功能。

个人来说,我会倾向于将这些内容放在特定后端配置文件中,但这显然不是您想要的。:)

感谢这些有用的想法——用这种方式实现实名制,我从未想过。谢谢。
刚刚又遇到了这个问题,回到这个答案,记得它有多么好。希望我能再次给你点赞。再次感谢!
...