Skip to content

Instantly share code, notes, and snippets.

@ponkore
Created July 25, 2012 01:49
Show Gist options
  • Save ponkore/3173902 to your computer and use it in GitHub Desktop.
Save ponkore/3173902 to your computer and use it in GitHub Desktop.
Clojure Programming Chapter2 P.73〜P.76 logger
(defn print-logger
[writer]
#(binding [*out* writer]
(println %)))
(def *out*-logger (print-logger *out*))
;= #'user/*out*-logger
(*out*-logger "hello")
; hello
;= nil
(def writer (java.io.StringWriter.))
;= #'user/writer
(def retained-logger (print-logger writer))
;= #'user/retained-logger
(retained-logger "hello")
;= nil
(str writer)
;= "hello\n"
(require 'clojure.java.io)
(defn file-logger
[file]
#(with-open [f (clojure.java.io/writer file :append true)]
((print-logger f) %)))
(def log->file (file-logger "message.log"))
;= #'user/log->file
(log->file "hello")
;= nil
; $ 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")))
;= #'user/log
(log "hello again")
; hello again
;= nil
; $ more message.log
; hello
; hello again
(defn timestamed-logger
[logger]
#(logger (format "[%1$tY-%1$tm-%1$te %1$tH:%1$tM:%1$tS] %2$s" (java.util.Date.) %)))
(def log-timestamped (timestamed-logger
(multi-logger
(print-logger *out*)
(file-logger "message.log"))))
(log-timestamped "goodbye, now")
;[2012-07-25 10:42:59] goodbye, now
;nil
; $ more message.log
;hello
;hello again
;[2012-07-25 10:42:59] goodbye, now
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment