Goのログ出力:log.Println と log.Printf の違いを理解しよう
Go言語でログを出力する際に使われる標準ライブラリの log
パッケージ。この記事では、特に使用頻度が高い log.Println
と log.Printf
の違いについて解説します。それぞれの使い方とメリットを知ることで、デバッグ効率やログの可読性を向上させましょう。
log.Println
の特徴
- シンプルなログ出力
引数をスペースで区切り、そのまま出力します。 - フォーマット指定ができない
値をそのまま文字列に変換して出力するため、特定のフォーマットを指定することはできません。
サンプルコード
package main
import (
"log"
)
func main() {
err := "some-error"
form := map[string][]string{"key1": {"value1"}, "key2": {"value2"}}
path := "/example/path"
log.Println("Println:", err, form, path)
}
出力例
Println: some-error map[key1:[value1] key2:[value2]] /example/path
log.Printf
の特徴
- フォーマット指定が可能
fmt.Printf
と同様にフォーマット指定子を使用して、出力形式を柔軟にカスタマイズできます。 - 詳細なデバッグに便利
データ型や内部構造、特定の桁数指定など、デバッグ時に役立つ情報を制御可能。
サンプルコード
package main
import (
"log"
)
func main() {
err := "some-error"
form := map[string][]string{"key1": {"value1"}, "key2": {"value2"}}
path := "/example/path"
log.Printf("Printf: err=%q, form=%+v, path=%q", err, form, path)
}
出力例
Printf: err="some-error", form=map[key1:[value1] key2:[value2]], path="/example/path"
どちらを使うべき?
log.Println
を使う場面
- 単純なログ出力が必要な場合。
- データそのものを平文で出力して問題ない場合。
log.Printf
を使う場面
- 詳細なフォーマットが必要な場合
例えば、数値のゼロ埋めやクォート付き文字列、構造体のフィールド名の表示など。 - 複雑なデータ型の出力
マップや構造体の中身を明確にしたい場合。 - デバッグや分析
特定のフォーマットで一貫したログを残したい場合。
log.Printf
のフォーマット例
以下の表は、log.Printf
で使えるフォーマット指定子の一部です。
指定子 | 説明 | 出力例 |
---|---|---|
%v |
デフォルト形式で出力 | map[key1:[value1]] |
%+v |
構造体の場合、フィールド名付きで出力 | {Key:key1 Value:value1} |
%#v |
Go構文形式で詳細出力 | map[string][]string{"key":[value]} |
%q |
クォート付きで文字列を出力 | "Hello, World!" |
%04d |
整数を4桁ゼロ埋めで出力 | 0042 |
%.2f |
小数点以下2桁で丸めた浮動小数点数を出力 | 3.14 |
引数がない場合の挙動
log.Printf
はフォーマット文字列が必要ですが、引数が空の場合は単にフォーマット文字列がそのまま出力されます。例えば以下のようなコード:
log.Printf("Printf: %v;", err)
引数 err
が空の場合も安全に動作しますが、出力はシンプルになります。
結論:使い分けをマスターしよう
- シンプルなログが必要な場合 →
log.Println
- カスタマイズ性や詳細なデバッグが必要な場合 →
log.Printf
どちらも適材適所で使い分けることで、ログの品質を向上させ、デバッグ作業を効率化できます! 🎯
ぜひ、実際のコードで試してみてください! 😊
登録日:
更新日:
by
プログラマーこまつ