あまりいいデザインというのも思い浮かばないんだけど、なんとなくこんな感じのロガーがあればいいかなぁと思い30分くらいで作ってみた。こんな感じで使える。
(import (srfi :18) (util logging) (util file)) (define (print-log logger) (trace-log logger "trace") (debug-log logger "debug") (info-log logger "info") (warn-log logger "warn") (error-log logger "error") (fatal-log logger "fatal") (terminate-logger! logger)) (print-log (make-logger +info-level+ (make-appender "[~l] ~w4 ~m"))) (print) (print-log (make-async-logger +debug-level+ (make-appender "[~l] ~w4 ~m") (make-file-appender "[~l] ~w4 ~m" "log.log"))) (print (file->string "log.log")) #| [info] 2016-08-30T16:02:29+0200 info [warn] 2016-08-30T16:02:29+0200 warn [error] 2016-08-30T16:02:29+0200 error [fatal] 2016-08-30T16:02:29+0200 fatal [debug] 2016-08-30T16:02:29+0200 debug [info] 2016-08-30T16:02:29+0200 info [warn] 2016-08-30T16:02:29+0200 warn [error] 2016-08-30T16:02:29+0200 error [fatal] 2016-08-30T16:02:29+0200 fatal [debug] 2016-08-30T16:02:29+0200 debug [info] 2016-08-30T16:02:29+0200 info [warn] 2016-08-30T16:02:29+0200 warn [error] 2016-08-30T16:02:29+0200 error [fatal] 2016-08-30T16:02:29+0200 fatal |#ロガーがログレベルと同期をコントロールして、アペンダーが実際にログを吐き出す。どこかでみたことあるようなモデルではある。まぁ、本職はその言語を使うのでなんとなく似通ったのだろう。
make-appender
でつくられるアペンダーは標準出力(正確にはcurrent-output-port
が返す値)に吐き出す。アペンダーの第一引数はログのフォーマット。現状手の込んだ出力はできないが、当面はこれでも問題ないだろう。ちなみに、~w
の後ろに続く4
はSRFI−19で定義されているフォーマットの一つ。現在は一文字しかみないが、そのうちなんとかするかもしれない。make-async-logger
はスレッドを一つ消費する代わりにログの書き出しをバックグラウンドでやってくれる。アペンダーが複数あったり、処理が重い(メール送るとか) 等あるときに役に立つと思う。とりあえずこれを適当に使ってるスクリプト等に組み込んで使用感を確かめていくことにしよう。