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")
댓글 없음:
댓글 쓰기