LoginSignup
3
1

More than 5 years have passed since last update.

Go でレベル付きのログ出力に hashicorp/logutils を使ってみる

Posted at

自分の作っているアプリで、レベル付きのログ出力をしたくなった。残念ながら、標準の 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 は今回の目的にぴったりでシンプル!最高!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1