コンテンツにスキップ

slog時代のGoではloggerをcontextで引きまわさなくて良い気がする - Diary of a Perpetual Student

チェック

  • [ ] 本文を確認した
  • [ ] 概要を確認した
  • [ ] タグを確認した
  • [ ] inbox/ 直下へ移行した

概要

slog時代のGoではloggerをcontextで引きまわさなくて良い気がする - Diary of a Perpetual Student のWebクリップ。本文からGo、AWS、Observability、設計、キャリア評価などの学習材料として使えそうな内容を保存した。関連タグ: architecture, go, go/context, observability, opentelemetry, web-clip。

本文

Diary of a Perpetual Student

Perpetual Student: A person who remains at university far beyond the normal period

slog時代のGoではloggerをcontextで引きまわさなくて良い気がする

Goのloggerを引き回す際に皆さんはどのような手法を取っていますか?

  • グローバル変数にloggerのインスタンスを入れておく

  • contextにloggerのインスタンスを入れておく

  • トレースIDなどを入れたloggerを適宜作ってcontextに格納する

  • 構造体のフィールドにloggerのインスタンスを入れておく(DI)

などなど、ソフトウェアの規模や特性を鑑みて各自使い分けているかと思います。

ところで、私は 2. 3. の手法があまり好きではありませんでした。単純に面倒だし美しくありません。contextに入れる、取り出すだけでも数行のコードを毎度書く必要があってダルいな〜と思っていました。けれども、ログにトレースIDなどを入れたいだろうなあと思い、Webサーバの実装においては 2. を渋々選択していました。

さて、Go 1.21ではslogパッケージが登場しました。slogは単に構造化ログが扱えるというだけでなく、使いやすかったりトレースと統合できたりということも考慮されて設計されています。

go.googlesource.com

slog.SetDefault(l *Logger)
slog.InfoContext(ctx context.Context, msg string, args ...any)

pkg.go.dev

Handle()

SetDefault()

type LogWithTraceHandler struct { inner slog.Handler } func NewLogWithTraceHandler(inner slog.Handler) LogWithTraceHandler { return LogWithTraceHandler{inner} } func (h *LogWithTraceHandler) Handle(ctx context.Context, r slog.Record) error { sc := trace.SpanContextFromContext(ctx) if sc.IsValid() { r.AddAttrs( slog.String("trace_id", sc.TraceID().String()), slog.String("span_id", sc.SpanID().String()), ) } return h.inner.Handle(ctx, r) } func main() { logger := NewLogWithTraceHandler(slog.NewJSONHandler(os.Stderr, nil)) slog.SetDefault(logger) // あとは context に SpanContext を詰めて slog.InfoContext(ctx, "message", ...) で呼び出し }

(コードはブラウザ上で適当に書いたので動かないかもしれません。机上論。)

slog.SetDefault()

2024-07-08 追記: 机上論じゃないバージョンです

blog.arthur1.dev

*1:ソースコード: https://github.com/golang/go/blob/66d34c7d08d7c536c3165dc49ed318e73ea5acc2/src/log/slog/logger.go#L61-L74

Software Engineer, Audio Engineer & PTCG Player. Tech Lead & Product Owner, Mackerel Dev, Hatena Co., Ltd.

  • Website

  • GitHub: @Arthur1

  • Presentations

  • PHPerKaigi 2026で「PHP 7.4でもOpenTelemetryゼロコード計装がしたい!」という発表をしました

  • 【2026年最新改良版】Google SlideからSpeakerDeckに上げるPDFを品質良く文字化けさせず作る方法

  • GitHub ActionsのDockerのバージョンアップにより、ビルドしたコンテナをLambdaにデプロイするときに失敗するようになったかもしれない

  • OpenTelemetryコレクターのOTLP Exporterをotlpではなくotlp_grpcとして呼ぶように変わる話(そしてそのうち他のコンポーネントでも……)

  • Recap 2025

  • 男女5名のコミュニティリーダーが語る、エンジニア×ネイルアートの魅力──キラキラエンジニアへの道は輝く指先から!|CodeZine(コードジン)

  • 新卒研修として開発した「はてなピアスター」がSlack活用アワードで優勝しました | Hatena Developer Blog

  • MackerelはOpenTelemetry対応のための開発を進めています - Mackerel Meetup復活記念連載 #1 | Mackerel お知らせ #mackerelio

  • AWS JumpStart for NewGradsで、はてな新卒エンジニアがクラウドアーキテクチャ設計に取り組んできた | Hatena Developer Blog

  • 2026 / 3

  • 2026 / 2

  • 2026 / 1

  • 2025 / 12

  • 2025 / 11

  • 2025 / 10

  • 2025 / 9

  • 2025 / 8

  • 2025 / 7

  • 2025 / 6

  • 2025 / 5

  • 2025 / 4

  • 2025 / 3

  • 2025 / 2

  • 2025 / 1

  • 2024 / 12

  • 2024 / 11

  • 2024 / 10

  • 2024 / 9

  • 2024 / 8

  • 2024 / 7

  • 2024 / 6

  • 2024 / 5

  • 2024 / 4

  • 2024 / 3

  • 2024 / 2

  • 2024 / 1

  • 2023 / 12

  • 2023 / 11

  • 2023 / 10

  • 2023 / 9

  • 2023 / 8

  • 2023 / 7

  • 2023 / 6

  • 2023 / 5

  • 2023 / 4

  • 2023 / 3

  • 2023 / 2

  • 2023 / 1

  • 2022 / 12

  • 2022 / 11

  • 2022 / 10

  • 2022 / 9

  • 2022 / 8

  • 2022 / 7

  • 2022 / 6

  • 2022 / 5

  • 2022 / 4

引用をストックしました

引用するにはまずログインしてください

引用をストックできませんでした。再度お試しください

限定公開記事のため引用できません。

要点

  • Goの実装・設計・標準的な書き方を面接や実務の深掘り材料にする。
  • トレーシング、メトリクス、可観測性の説明材料として使う。
  • 元URL: https://blog.arthur1.dev/entry/2024/01/19/093000

タグ

architecture #go #go/context #observability #opentelemetry #web-clip