DEV Community

voluntas for Shiguredo Inc.

Posted on • Edited on

2 1

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

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More