Skip to content

Instantly share code, notes, and snippets.

@simlegate
Last active December 28, 2015 13:49
Show Gist options
  • Save simlegate/7509977 to your computer and use it in GitHub Desktop.
Save simlegate/7509977 to your computer and use it in GitHub Desktop.
利用可组合的高阶函数构建的一个日志系统
(ns logger.core)
(defn print-logger
[writer]
#(binding [*out* writer]
(println %)))
;; 将消息打印到一个内存buffer
(def writer (java.io.StringWriter.))
(def retained-logger (print-logger writer))
(retained-logger "hello")
;; user=> (str logger.core/writer)
;; "hello\n"
;; 将消息打印到文件中
(defn file-logger
[file]
#(with-open [f (clojure.java.io/writer file :append true)]
((print-logger f) %)))
(def log-file (file-logger "message.log"))
(log-file "hello")
;; % more message.log
;; hello
;; 将日志打印到多个输出设备
(defn multi-logger
[& logger-fns]
#(doseq [f logger-fns]
(f %)))
(def log (multi-logger
(print-logger *out*)
(file-logger "message.log")))
(log "hello again")
;; % more message.log
;; hello
;; hello again
;; 在每条日志前面加一个时间戳
(defn timestamped-logger
[logger]
#(logger (format "[%1$tY-%1$tm-%1$te %1$tH:%1$tM:%1$tS] %2$s" (java.util.Date.) %)))
(def log-timestamped (timestamped-logger
(multi-logger
(print-logger *out*)
(file-logger "message.log"))))
(log-timestamped "goodbye, now")
;; % more message.log
;; hello
;; hello again
;; [2013-11-17 23:22:17] goodbye, now
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment