使用clojure.tools.logging在同一名称空间中使用多个记录器

时间:2014-06-06 06:53:19

标签: logging clojure logback

我正在使用clojure.tools.logging,它使用slf4j工厂来实例化Logback记录器。

我想做的是能够让我的DAO命名空间将正常消息记录到应用程序日志中,但是将所有SQL查询记录到查询日志中。

clojure.tools.logging code,这看起来不太可能,但我希望有人可以证明我错了。 :)

如果clojure.tools.logging无法执行此操作,是否有人可以建议另一个可以实现我想要的日志工具?或者是否可以在Logback的配置文件中进行路由?

2 个答案:

答案 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))