Building a Primitive Logging System. with Composable Higher-Order Functions
(defn print-logger [writer]
#(binding [*out* writer]
(println %)))
(def *out*-logger (print-logger *out*))
(*out*-logger "hello")
버퍼를 만들어 보자.
(def writer (java.io.StringWriter.)) (def retained-logger (print-logger writer)) (retained-logger "hello-1") (retained-logger "hello-2") (str writer)
파일에 써보자.
(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"))
(log->file "HELLO FILE")
지금까지는 아주 적은 코드로 서로 다른 곳에 쓸 수 있는 방법을 알아봤다.만약, 여러곳에 써야 한다면 어떻게 해야 할까. doseq를 쓴다.
(defn multi-logger
[& logger-fns]
#(doseq [f logger-fns]
(f %)))
(def log (multi-logger
(print-logger *out*)
(file-logger "message.log")))
(log "hello console and file")
마지막 예제, 진짜 로깅인 것처럼 시간 포맷까지 앞에 붙여보자.
Adding a piece of "logging middleware" to include a timestamp with each log message
(defn timestamped-logger
[logger]
#(logger (format "[%1$tY-%1$tm-%1$ts %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 "goobye, now")
댓글 없음:
댓글 쓰기