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

欢迎!请参阅关于页面获取更多关于这个平台的信息。

+1
tools.logging

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

  • 是否可以在调用此代码期间程序性地(即,不是从某些配置文件),并且从外部抑制这些消息?

如果可能的话,我宁愿不想知道正在使用的日志工厂等...

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

感谢您的时间和考虑!

1 答案

+3
by
selected by
 
最佳答案

如果您只想禁用特定调用中发生的所有日志记录,可以将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)))))

有很多改进、抛光和优化的空间,但看起来已经有了实现所需功能所需的所有必要组件。

个人来说,我倾向于将这些类型的东西放在后端特定的配置文件中,但这显然不是你想要的。 :)

感谢这些有价值的想法——用这种方式具体化覆盖,我之前并没有想到。谢谢。
又遇到了这个问题,回到这个答案,又想起了它有多好。我希望能再次为您点赞。再次感谢!
...