1

Timbre を使用して、同じ名前空間から 2 つの異なるファイルにログを記録しようとしています。または、それが不可能な場合は、少なくとも 2 つの異なる名前空間からの異なるファイルに。

調べtimbre/*config*てみると、そのような構成を行うには 2 つの構成マップが必要だという印象を受けます。別の構成マップを作成してtimbre/log*、標準の構成マップの代わりに使用することはできますが、これは本来の使用方法ではないという感覚を払拭できません...?

(timbre/log* timbre/*config* :info "Test with standard config")
4

1 に答える 1

2

私の知る限り、最も簡単な方法は、2 つの構成マップを作成することです。

(def config1
   {:level :debug 
    :appenders {:spit1 (appenders/spit-appender {:fname "file1.log"})}})

(def config2
   {:level :debug 
    :appenders {:spit2 (appenders/spit-appender {:fname "file2.log"})}})

(timbre/with-config config1
    (info "This will print in file1") )

(timbre/with-config config2
    (info "This will print in file2") )

2 番目の方法は、spit-appender から独自のアペンダーを作成することです。

https://github.com/ptaoussanis/timbre/blob/master/src/taoensso/timbre/appenders/core.cljx

(defn my-spit-appender
  "Returns a simple `spit` file appender for Clojure."
  [& [{:keys [fname] :or {fname "./timbre-spit.log"}}]]
  {:enabled?   true
   :async?     false
   :min-level  nil
   :rate-limit nil
   :output-fn  :inherit
   :fn
   (fn self [data]
     (let [{:keys [output_]} data]
       (try

        ;; SOME LOGIC HERE TO CHOOSE THE FILE TO OUTPUT TO ...             

         (spit fname (str (force output_) "\n") :append true)
         (catch java.io.IOException e
           (if (:__spit-appender/retry? data)
             (throw e) ; Unexpected error
             (let [_    (have? enc/nblank-str? fname)
                   file (java.io.File. ^String fname)
                   dir  (.getParentFile (.getCanonicalFile file))]

               (when-not (.exists dir) (.mkdirs dir))
               (self (assoc data :__spit-appender/retry? true))))))))})
于 2016-12-04T03:19:21.517 に答える