DEV Community

voluntas for Shiguredo Inc.

Posted on • Edited on

zerolog と lumberjack と io.MultiWriter

#go

最近 Go で小さなミドルウェアと小さなウェブアプリを書いています。その際に欲しくなるのがログ出力の仕組みとログローテーションの仕組みです。

ログライブラリに対する要望

  • ログ出力は JSON できること
  • JSON 出力の場合はログレベルを指定しないでできること
  • 独自フォーマットにも対応していること

ログローテーションライブラリに対する要望

  • 組み込みが簡単であること

zerolog

rs/zerolog: Zero Allocation JSON Logger

性能は特に求めていないのですが、一通り欲しかった機能があったので zerolog を採用しました。

良いところ

  • logger.Log() でログレベルなしで出力できる
  • logger.Err(err) と err がきれいに出力できる
  • logger.Str("abc", xyz).Int("123", 234) とわかりやすく型付きでログを定義できる
  • zerolog.ConsoleWriter を使うことで独自フォーマットを定義できる
  • タイムフォーマットが気軽に利用可能
  • UTC 出力にしようと思った時、簡単にできた

良くないところ

  • JSON ベースなので仕方ないが key=value の順番指定ができない

lumberjack

natefinch/lumberjack: lumberjack is a log rolling package for Go

良いところ

  • 簡単に組み込める

悪いところ

  • 特になし

使ってみる

stdout と file 両方に出力するように、 MultiWriter を使っています。

io - The Go Programming Language

package main

import (
    "io"
    "os"
    "time"

    "github.com/rs/zerolog"
    "gopkg.in/natefinch/lumberjack.v2"
)

func main() {
    zerolog.TimeFieldFormat = time.RFC3339Nano

    writer := &lumberjack.Logger{
        Filename: "test.log",
        // メガバイト
        MaxSize:    10,
        MaxBackups: 5,
        // 日
        MaxAge: 1,
        // デフォルトは無効
        Compress: true,
    }

    // ここで stdout とファイルの両方に書き出すようにする
    writers := io.MultiWriter(os.Stdout, writer)
    log := zerolog.New(writers).With().Timestamp().Logger()

    log.Log().
        Int("baz", 123).
        Msg("hello world")
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)