zapパッケージとは
zapは、Uberが開発した高速で構造化されたロギングライブラリで、Go言語のロギングに関する多くの問題を解決します。特にパフォーマンスに優れており、大量のログ出力が必要なアプリケーションでもその影響を最小限に抑えることができます。
Go言語でのログ出力: ベストパフォーマンスを出すためのパッケージ比較
基本的な使い方
最初に、zapパッケージの基本的な使用方法を紹介します。以下は、ログを出力するシンプルなコードです。
package main
import (
"go.uber.org/zap"
)
func main() {
logger, _ := zap.NewProduction()
defer logger.Sync() // ログをフラッシュします。
logger.Info("zap tutorial",
zap.String("library", "zap"),
zap.Int("version", 1),
)
}
このコードを実行すると、以下のようなログが出力されます。
{"level":"info","ts":1622031516.164123,"caller":"zap/main.go:11","msg":"zap tutorial","library":"zap","version":1}
ここでzap.NewProduction()
はProduction(本番環境向け)レベルのロガーを生成します。また、logger.Info
関数でInfoレベルのログを出力しています。
zapのログレベルについて
zapパッケージでは、ログのレベルを設定してそのレベル以上のログだけを出力することができます。それぞれのログレベルは以下の通りです:
- DebugLevel
- InfoLevel
- WarnLevel
- ErrorLevel
- DPanicLevel
- PanicLevel
- FatalLevel
次にこれらのログレベルの使用方法を示します。
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"github.com/natefinch/lumberjack"
)
func main() {
config := zap.NewProductionConfig()
config.Level = zap.NewAtomicLevelAt(zap.ErrorLevel)
logger, _ := config.Build()
defer logger.Sync()
logger.Debug("This is a DEBUG message") // This will not be printed
logger.Info("This is an INFO message") // This will not be printed
logger.Warn("This is a WARN message") // This will not be printed
logger.Error("This is an ERROR message")
}
上記のコードでは、ログレベルをErrorLevelに設定しています。その結果、Errorレベル以上のログ(この場合、Errorレベルのログのみ)が出力されます。したがって、「This is an ERROR message」のみが出力されます。
高度な設定
zapパッケージでは、ログのフォーマットや出力先など、様々な設定をカスタマイズすることが可能です。以下のコードは、ログをJSON形式でファイルに出力する例です。
まずは、ログローテーションを行うパッケージであるlumberjackを使っていきたいと思うのでこれをインストールします
go get github.com/natefinch/lumberjack
続き実際にログを出力します
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"github.com/natefinch/lumberjack"
)
func main() {
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.TimeKey = "timestamp"
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
core := zapcore.NewCore(
zapcore.NewJSONEncoder(encoderConfig),
zapcore.AddSync(&lumberjack.Logger{
Filename: "zap.log",
MaxSize: 500, // megabytes
MaxBackups: 3,
MaxAge: 28, // days
}),
zap.InfoLevel,
)
logger := zap.New(core)
defer logger.Sync()
logger.Info("This is a test log.")
}
このコードを実行すると、”zap.log”というファイルにログがJSON形式で出力されます。
zap
とlumberjack
パッケージを組み合わせて、ログファイルを生成し、それが一定のサイズを超えたときに新しいファイルに切り替える(ローテートする)ようにします。また、古いログファイルは自動的に削除されます。
まとめ
この記事では、zapパッケージの基本的な使用方法から高度な設定までを解説しました。ログ出力はアプリケーション開発において重要な部分です。zapパッケージを活用して、より効率的で有用なログ出力を実現しましょう。