onemuri.space

golang で構造化ロギング

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(zapzerolog)のページには 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 レベルのログが出力されていないのが気になりました…

logrus-terminal
logrus-console

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 の情報を結びつけてくれていました。(便利)

zap-terminal
zap-console

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 レベルが出力されていないように見えますが、実際にはこの出力の少し前に全て出力されていました。

zerolog-terminal
zerolog-console

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")

本当にとってもシンプル。

log15-terminal
log15-console

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 してくれるとログ作りやすくていいですね。

apex-terminal
apex-console

まとめ

いかがだったでしょうか。ざっとロギングツールの使い方と出力結果を並べてみると Logger 導入の容易さと、シンプルな使い心地がわかるのではないでしょうか。

今回は基礎的な部分のみをまとめたので、次回 Logger ツールについてまとめるときは特定のツールに絞って、より詳細に企業運用レベルでの使用方法を意識してみようと思います。

自己紹介用画像

Riki Akagi

2019年からDeNAで働いています。GCP(CloudSQL・GAE・Cloud Function etc)とGoでAPI開発に勤んでいます。睡眠やエンジニアリングに関することに興味を持って過ごしているのでその情報を皆さんに共有していけたらなと思っています。

自己紹介の詳細