最近 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")
}
Top comments (0)