Go言語でのログ出力: ベストパフォーマンスを出すためのパッケージ比較

Go

はじめに

ログはソフトウェア開発の重要な一部であり、エラーのトラブルシューティングからシステムのパフォーマンスモニタリングまで、様々な目的に使われます。Go言語には、組み込みのログパッケージが存在しますが、より高度な機能を求める場合は、サードパーティのパッケージを検討する価値があります。この記事では、Go言語でよく利用されるログ出力パッケージを比較し、それぞれのメリットを詳細に説明します。

流行りに乗ってGo言語を使ってみた(インストールからHelloWorld表示まで)

流行りに乗ってGo言語を使ってみた(インストールからHelloWorld表示まで)
Go言語とは 2009年、GoogleでRobert Griesemer、ロブ・パイク、ケン・トンプソンによって設計された。Goは、静的型付け、C言語の伝統に則ったコンパイル言語、メモリ安全性、ガベージコレクション、構造的型付け(英語版)、...

logパッケージ

Goの標準ライブラリに含まれる”log”パッケージは、基本的なログ出力のニーズを満たします。しかし、これはシンプルさを優先しているため、より詳細なログレベルの制御やカスタムフォーマットなどの高度な機能は提供していません。

こちらで詳細な使い方を紹介しています

Go言語の標準logパッケージ:初心者から上級者への詳細な使い方について紹介
はじめに Go言語の標準ライブラリの中にあるlogパッケージは、基本的なログ出力機能を提供します。しかし、このパッケージの力はそのシンプルさの中にあり、その機能を適切に利用すれば、高度なロギングを実現することも可能です。この記事では、Go言...
package main

import (
	"log"
)

func main() {
	log.Print("This is a test log message.")
}

上記のコードはシンプルな日付とログメッセージを出力します。

2023/05/24 07:13:25 This is a test log message.
log package - log - Go Packages
Package log implements a simple logging package.

logrusパッケージ

logrusはGoで広く使われているロギングライブラリの一つであり、標準の”log”パッケージよりも多くの機能を提供します。ログレベル、ログフォーマッター、フックという機能があり、これらを使うことで、ログ出力を細かくカスタマイズすることが可能です。

こちらで詳細な使い方を紹介しています

Logrusを用いた効率的なログ出力:Go言語での詳細な使い方と実装
Logrusとは Logrusは、Go言語の構造化されたログ出力ライブラリであり、標準パッケージであるlogよりも拡張性が高いです。様々な出力フォーマットをサポートし、ログレベルによるフィルタリングやフックと呼ばれる機能により、特定のイベン...
package main

import (
	"github.com/sirupsen/logrus"
)

func main() {
	logrus.SetFormatter(&logrus.JSONFormatter{})
	logrus.Info("This is a test log message.")
}

上記のコードはJSON形式でログメッセージを出力します。

{"level":"info","msg":"This is a test log message.","time":"2023-05-24T07:14:26+09:00"}
GitHub - sirupsen/logrus: Structured, pluggable logging for Go.
Structured, pluggable logging for Go. Contribute to sirupsen/logrus development by creating an account on GitHub.

zapパッケージ

Uberが開発したzapは、パフォーマンスと構造化ログの両方に重点を置いて設計されています。zapは非常に高速で、CPUとメモリの使用量も最小限に抑えられています。これは、大量のログ出力が必要な大規模なアプリケーションにとって魅力的な選択肢となります。

こちらで詳細な使い方を紹介しています

Go言語での効率的なロギング: "zap"パッケージの使い方とその強力な機能
zapパッケージとは zapは、Uberが開発した高速で構造化されたロギングライブラリで、Go言語のロギングに関する多くの問題を解決します。特にパフォーマンスに優れており、大量のログ出力が必要なアプリケーションでもその影響を最小限に抑えるこ...
package main

import (
	"go.uber.org/zap"
)

func main() {
	logger, _ := zap.NewProduction()
	defer logger.Sync()
	logger.Info("This is a test log message.")
}

上記のコードはzapを使用してログメッセージを出力した例です

{"level":"info","ts":1684880159.2947478,"caller":"sample/main.go:10","msg":"This is a test log message."}
GitHub - uber-go/zap: Blazing fast, structured, leveled logging in Go.
Blazing fast, structured, leveled logging in Go. Contribute to uber-go/zap development by creating an account on GitHub.

zerologパッケージ

zerologは、ゼロメモリアロケーションとJSONロギングに焦点を当てた高パフォーマンスGoロギングライブラリです。これは、ロギングのパフォーマンスが重要なアプリケーションにとって有益な選択です。

こちらで詳細な使い方を紹介しています

Go言語の強力なロギングツール:Zerologパッケージの詳細な使い方
はじめに 本記事では、Go言語のzerologパッケージについて紹介します。ロギングはアプリケーション開発において必要不可欠な部分であり、それに関連するツールの選択は開発者にとって重要な課題です。Go言語には数多くのロギングパッケージがあり...
package main

import (
	"github.com/rs/zerolog/log"
)

func main() {
	log.Info().Msg("This is a test log message.")
}

上記のコードはzerologを使用してログメッセージを出力します。

{"level":"info","time":"2023-05-24T07:21:07+09:00","message":"This is a test log message."}
GitHub - rs/zerolog: Zero Allocation JSON Logger
Zero Allocation JSON Logger. Contribute to rs/zerolog development by creating an account on GitHub.

まとめ

Go言語でログ出力を行うためのライブラリは多数存在し、それぞれが特定のシナリオと要件に最適化されています。標準の”log”パッケージはシンプルであり、”logrus”はカスタマイズが可能で、”zap”と”zerolog”は高パフォーマンスを重視しています。これらのパッケージを使用する際は、それぞれの特性を理解し、あなたのプロジェクトに最適なものを選ぶことが重要です。

参考情報