最近 logging について興味が出てきたので、 golang の logging ツールを調べてみました。
logging ツールをまとめてみる
名称 | Star数 | 最新commit日付 |
---|---|---|
sirupsen/logrus | 15.2k | last month |
uber-go/zap | 10.1k | 2 months ago |
rs/zerolog | 3.5k | last month |
inconshreveable/log15 | 966 | 6 months ago |
apex/log | 948 | last month |
※ 2020年6月時点
logging ツールの使用感
今回はとにかく使用感だけまとめたので、それぞれのツールの細かい話については別記事でまとめます。とりあえず使い方だけみたいという方にはさくっと確認しやすいかと思います。
log の出力結果を terminal と GCP Logging 上での画像も用意しているので是非参考にしてみてください。(一部ソースコードと画像の出力結果の文字が異なりますが、文字列の違いだけなのでご容赦ください)
ただ、表でもまとめた5つのツールを使ってみて思ったのは 構造化ロギングができることと、ログレベルの種類は同様だったように感じます。また、github(zap や zerolog)のページには logging ツールのパフォーマスがベンチマークで計測されているので log がアプリに与える影響を調べてみたい人は参考にしてみると良いと思います。
Logrus
Logrus は現在メンテナンスモードで運用されています。golang の構造化ロギングの頒布をし、現在は Zerolog や Zap、 Apex などが構造化ロギングを受け継いで開発されています。
V2 の予定はなさそうです。
【使い方】
logger := logrus.WithFields(logrus.Fields{"logger": "logrus", "api": "blog-api"})
logger.Debug("logrus debug logger")
logger.Info("logrus info logger")
logger.Warning("logrus warning logger")
logger.Error("logrus error logger")
debug レベルのログが出力されていないのが気になりました…
Zap
Uber が OSS で作成している Logger です。
JSON 形式でログを出力します。(Zerolog も同様に)
【使い方】
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Debug("debug")
logger.Info("info", zap.String("key", "value"))
sugar := logger.Sugar()
sugar.Warn("warning sugar")
sugar.Error("error sugar")
Zap は error レベルの場合は自動で stacktrace の情報を結びつけてくれていました。(便利)
Zerolog
Zap を参考に作成された Logger。
JSON 形式でログを出力します。(Zap も同様に)
【使い方】
ctx := log.Logger.WithContext(context.Background())
log.Ctx(ctx).Trace().Msg("zerolog trace logger")
log.Ctx(ctx).Debug().Msg("zerolog debug logger")
log.Ctx(ctx).Info().Msg("zerolog info logger")
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
log.Ctx(ctx).Warn().Msg("zerolog warning logger")
log.Ctx(ctx).Error().Msg("zerolog error logger")
log 出力のタイミングが若干ずれて GCP Logging の方は trace, debug, info レベルが出力されていないように見えますが、実際にはこの出力の少し前に全て出力されていました。
Log15
シンプルな使い心地のある Logger です。
【使い方】
logger := log15.New("logger", "logrus", "api", "blog-api")
logger.Debug("log15 debug logger")
logger.Info("log15 info logger")
logger.Warn("log15 warn logger")
logger.Error("log15 error logger")
本当にとってもシンプル。
Apex Log
Logrus を参考にして作られた Logger です。
今回の記事のサーバーでは realize で起動していますが、 apex だけは勝手にログに色をつけてくれていました。
【使い方】
var errApexLog = errors.New("error apex log")
log.SetHandler(text.New(os.Stderr))
ctx := log.WithFields(log.Fields{ "logger": "apex log", })
ctx.Debug("apex debug logger")
ctx.Info("apex info logger")
ctx.Warn("apex warn logger")
ctx.Error("apex error logger")
ctx.WithError(errApexLog).Error("apex with error")
ctx.WithField("logger", "apex log").Trace("logging")
ctx.WithField("logger", "apex log").Trace("logging").Stop(&errApexLog)
他のツールもですが、 error を wrap してくれるとログ作りやすくていいですね。
まとめ
いかがだったでしょうか。ざっとロギングツールの使い方と出力結果を並べてみると Logger 導入の容易さと、シンプルな使い心地がわかるのではないでしょうか。
今回は基礎的な部分のみをまとめたので、次回 Logger ツールについてまとめるときは特定のツールに絞って、より詳細に企業運用レベルでの使用方法を意識してみようと思います。