我正在使用clojure.tools.logging,它使用slf4j工厂来实例化Logback记录器。
我想做的是能够让我的DAO命名空间将正常消息记录到应用程序日志中,但是将所有SQL查询记录到查询日志中。
看clojure.tools.logging code,这看起来不太可能,但我希望有人可以证明我错了。 :)
如果clojure.tools.logging无法执行此操作,是否有人可以建议另一个可以实现我想要的日志工具?或者是否可以在Logback的配置文件中进行路由?
答案 0 :(得分:3)
您应该可以使用log
宏的last two forms来指定此内容。我没试过这个,只检查了代码。
[编辑]
以下是测试工具中的sample:
(log "other.ns" :debug e "foo")
答案 1 :(得分:3)
ivant's answer是正确的;我只是添加这个答案来记录我为那些可能想要做这样的事情的人所做的事情。
首先,我在logback.xml
中创建了一个新的查询追加者:
<configuration>
<appender name="Query" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/query.log</File>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %m%n</pattern>
</encoder>
</appender>
<!-- Things logged to this logger should *not* also go to the root logger -->
<logger name="query" additivity="false" level="DEBUG">
<appender-ref ref="Query"/>
</logger>
<!-- root logger uses this appender, details not important -->
<appender name="App" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!- ... -->
</appender>
<root level="INFO">
<appender-ref ref="App"/>
</root>
</configuration>
其次,我在foo.db.util
命名空间中写了一个小宏:
(ns foo.db.util
(:require [clojure.string :refer [join]]
[clojure.tools.logging :refer [log]]
[korma.core :refer [as-sql]]))
(defn format-query [query & args]
(let [bind-str (->> args
flatten
(filter #(not (nil? %)))
(join " "))]
(str (as-sql query)
(when-not (empty? bind-str) (format " :: [%s]" bind-str)))))
(defmacro log-query [q & args]
`(log "query" :debug nil (format-query ~q ~@args)))
现在,我可以记录这样的查询:
(ns whatever
(:require [foo.db.util :refer log-query]
[korma.core :refer :all]))
(defentity foo)
(let [ids [1 2 3]
q (-> (select* foo)
(fields :bar :baz)
(where {:id [in ids]}))]
(log-query q ids)
(select q))