自分の作っているアプリで、レベル付きのログ出力をしたくなった。残念ながら、標準の log
パッケージでは、レベルに対応していない。どのようにするべきか?
要件
- Debug モードの時のみ詳細をダンプするようにしたい。
- Debug モード以外の時は、余計な物を出して欲しくない
- コマンドラインアプリケーション
という至ってシンプルなもの。出来るだけ公式の仕組みを使いたい。今回は、HashiCorp のlogutils を使ってみた。
こちらは、基本的な仕組みはlog
パッケージに乗っ取って最小の変更でレベルロギングを実現するというシンプルなもので、これでいい気がしてきた。しかも、terraform でも使っているので安心感があります。
環境変数の取得
最初にログレベルを取得するために、環境変数を取得する。
func Getenv(key string) string
これで一撃で環境変数が取れる
logutils の仕様
logutils
のトップページに従って、ロギングのセットアップを行う。とても簡単な仕組みで、log.SetOutput
に対して、io.Writer
である logutils.LevelFilter
をセットしているだけだ。とてもシンプル。それらを渡してあげると、ログにフィルターがかかる。下記の例では、ST_LOG
環境変数に、DEUBG
, INFO
, ERROR
をセットできるようになっている。
const (
EnvLog = "ST_LOG"
EnvLogFile = "ST_LOG_PATH"
)
func main() {
filter := &logutils.LevelFilter{
Levels: []logutils.LogLevel{"DEBUG", "INFO", "ERROR"},
MinLevel: logutils.LogLevel(os.Getenv(EnvLog)),
Writer: os.Stderr,
}
log.SetOutput(filter)
log.Println("[DEBUG] Now debugging...")
log.Println("[INFO] Echo useful information...")
log.Println("[ERROR] Error happens!...")
log.Println("Normal logging")
log.Fatalln("[DEBUG] Fatail!")
}
環境変数で、INFO
を設定した時の出力は次の通り。レベルが低いののみ出力される。
$ go run main.go
2018/09/17 19:17:40 [INFO] Echo useful information...
2018/09/17 19:17:40 [ERROR] Error happens!...
2018/09/17 19:17:40 Normal logging
exit status 1
log.Fataln
でも有効になるようだ。環境変数に、DEBUG
を設定して再度実行
$ go run main.go
2018/09/17 19:23:36 [DEBUG] Now debugging...
2018/09/17 19:23:36 [INFO] Echo useful information...
2018/09/17 19:23:36 [ERROR] Error happens!...
2018/09/17 19:23:36 Normal logging
2018/09/17 19:23:36 [DEBUG] Fatail!
exit status 1
これは簡単だ。先ほどの LevelFilter
には、Writer
という属性もあるので、こちらにファイルを設定するとファイルに書かれるようになるだろう。これは単純だけど、これで十分だ。レベルフィルターの実装はこちらから見れる。
次から便利な log
の関数について説明したい。
SetOutput
io.SetOutput はどのような関数かというと、めっちゃシンプル log の出力先を指定するためのもの。
func SetOutput(w io.Writer)
SetPrefix
これはプレフィックスを付けれる。かっこ良くなるかな。
log.SetPrefix("[Strikes] ")
を追加して実行。
$ go run main.go
[Strikes] 2018/09/17 19:29:29 [DEBUG] Now debugging...
[Strikes] 2018/09/17 19:29:29 [INFO] Echo useful information...
[Strikes] 2018/09/17 19:29:29 [ERROR] Error happens!...
[Strikes] 2018/09/17 19:29:29 Normal logging
[Strikes] 2018/09/17 19:29:29 [DEBUG] Fatail!
ん。ちょっとかっこ良くなった。
まとめ
というわけで、hashicorp/logutil
は今回の目的にぴったりでシンプル!最高!