ログレベルと属性
ログにコンテキストを追加します
「ログレベルと属性」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
ログにコンテキストを追加する
メッセージだけでは何が起きたかしか分かりません。属性を追加すると、どのユーザーか、どのリクエストか、どれくらい時間がかかったかといった、ログを実際に役立てるための詳細を記録できます。
4つのレベル
slog のレベルを、重要度の低い順に示します。
Debug(-4)Info(0)Warn(4)Error(8)
レベルは整数なので、その間に独自のレベルを定義することもできます。
レベルによるフィルタリング
HandlerOptions で最小レベルを設定します。それより低いレベルのレコードは、低コストで破棄されます。
package main
import (
"log/slog"
"os"
)
func main() {
opts := &slog.HandlerOptions{Level: slog.LevelWarn}
logger := slog.New(slog.NewTextHandler(os.Stdout, opts))
logger.Info("ignored")
logger.Warn("shown")
}型付き属性
単純なキーと値の引数に加えて、slog にはミスを防ぎ、より高速に処理できる型付きコンストラクターがあります。
slog.String("k", v)slog.Int("k", v)slog.Bool("k", v)slog.Duration("k", d)
slog.Info("done", slog.String("phase", "build"), slog.Int("files", 12))型付き属性を使う理由
型付き属性を使うと、「引数の数が奇数になる」というバグをコンパイル時に検出でき、ハンドラーがリフレクションを省略できます。頻繁に実行される処理では、型付き属性を優先してください。
属性のグループ化
slog.Group は関連するフィールドを1つのキーの下にネストします。
slog.Info("req",
slog.Group("http",
slog.String("method", "GET"),
slog.Int("status", 200),
),
)共有コンテキストのためのLogger.With
logger.With(...) は、すべてのメッセージに同じ属性を追加する子 Logger を返します。リクエスト ID の追加に最適です。
reqLog := logger.With("requestID", "abc-123")
reqLog.Info("started")
reqLog.Info("finished")コンテキスト対応ロギング
*Context 系の関数(例:InfoContext)は context.Context を受け取り、ハンドラーがトレース ID を取得できるようにします。
slog.InfoContext(ctx, "handling", "path", "/api")動的なレベル
slog.LevelVar を使うと、再起動せずに実行時のレベルを変更できます。たとえば、インシデントの調査中だけ Debug に引き上げることが可能です。
var lvl slog.LevelVar
lvl.Set(slog.LevelInfo)
h := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: &lvl})
// later: lvl.Set(slog.LevelDebug)属性としてのエラー
エラーはメッセージに連結するのではなく、属性として追加して検索できるようにしてください。
slog.Error("save failed", slog.String("err", err.Error()), slog.Int("retry", 2))実行例:レベルとWith
このプログラムはレベルでフィルタリングし、共有コンテキストを持つ子 Logger を使用します。
package main
import (
"log/slog"
"os"
)
func main() {
opts := &slog.HandlerOptions{Level: slog.LevelInfo}
base := slog.New(slog.NewTextHandler(os.Stdout, opts))
req := base.With("requestID", "r-7")
req.Debug("hidden")
req.Info("processing", slog.Int("items", 3))
}理解度チェック
レベルと属性について、理解度を確認しましょう。
まとめ
レベルと属性について学びました。
- 組み込みのレベルは4つあり、
HandlerOptions.Levelでフィルタリングする - 型付き属性(
slog.String、slog.Int)はより安全で高速 slog.Groupはフィールドをネストし、logger.Withはコンテキストを共有するLevelVarで実行時にレベルを変更できる
よくある質問
「ログレベルと属性」レッスンは無料ですか?
はい。「ログレベルと属性」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「ログレベルと属性」で何を学びますか?
ログにコンテキストを追加します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「ログレベルと属性」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 構造化ログを使う理由
- slogハンドラ
- ログレベルと属性
- カスタムハンドラ