0Pricing
Go Academy · レッスン

ログレベルと属性

ログにコンテキストを追加します

「ログレベルと属性」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 構造化ログを使う理由
  2. slogハンドラ
  3. ログレベルと属性
  4. カスタムハンドラ
← Go Academyに戻る