Logging 在clojure中获取调用方命名空间
我用Clojure包装了一个日志库;让我们调用这个Logging 在clojure中获取调用方命名空间,logging,clojure,namespaces,Logging,Clojure,Namespaces,我用Clojure包装了一个日志库;让我们调用这个foo.logger的名称空间。现在我有了另一个名称空间,比如bar.baz,从那里我调用了记录器 是否有一些惯用/好的方法可以确定记录器中调用方名称空间的名称空间?我不想将此设置为记录器的参数;-) 不是100%正确的解决方案,但适用于大多数情况: (some->> (.getStackTrace (Thread/currentThread)) (map #(re-matches #"
foo.logger
的名称空间。现在我有了另一个名称空间,比如bar.baz
,从那里我调用了记录器
是否有一些惯用/好的方法可以确定记录器中调用方名称空间的名称空间?我不想将此设置为记录器的参数;-) 不是100%正确的解决方案,但适用于大多数情况:
(some->> (.getStackTrace (Thread/currentThread))
(map #(re-matches #"^([^$]+)\$.+" (.getClassName %)))
(keep last)
(dedupe)
(second)
(symbol)
(find-ns))
这是使用宏是可靠选择的极少数情况之一 使打印值为
*ns
的宏在调用者空间中获得值为*ns*
,因为宏将在该命名空间中展开并运行
(defmacro log [msg]
`(printf "%s:%s\n" ~*ns* ~msg))
请注意这方面的“宏传染”,因为任何想要扩展此功能的东西都需要是宏,尽管我在过去六年中一直在这样做,但这并不是一个经常出现的问题。如果您询问Clojure,为什么要使用Java标记?请务必准确地标记您的问题。因为Clojure是编译成字节码的,如果有人用Java有一个好的答案,我可以修改它!按照这个逻辑,为什么不也用Scala标记它呢?这也被编译成字节码。Culjule认为使用java解决方案是习惯的,但不是Scala、Kotlin、JRube等。