関連記事
Goメモ-477 (slogメモ-01)(基本的な使い方) - いろいろ備忘録日記
Goメモ-478 (slogメモ-02)(構造化ログの出力) - いろいろ備忘録日記
Goメモ-479 (slogメモ-03)(デフォルトロガー) - いろいろ備忘録日記
Goメモ-480 (slogメモ-04)(従来のlogパッケージとの連携) - いろいろ備忘録日記
Goメモ-482 (slogメモ-05)(テキスト形式のログ) - いろいろ備忘録日記
Goメモ-483 (slogメモ-06)(JSON形式のログ) - いろいろ備忘録日記
Goメモ-484 (slogメモ-07)(動的にログレベルを変更) - いろいろ備忘録日記
Goメモ-485 (slogメモ-08)(グループ (1)) - いろいろ備忘録日記
Goメモ-486 (slogメモ-09)(グループ (2)) - いろいろ備忘録日記
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ
概要
以下、自分用のメモです。
今更ながら、Go 1.21で導入された log/slog
を使ってみたりしています。
少しづつメモしていきます。今回は機密情報などをログでマスキングする方法について。
サンプル
main.go
package main import ( "context" "errors" "log" "log/slog" "os" "time" ) const ( PasswordKey = "password" ) func main() { var ( rootCtx = context.Background() ctx, cxl = context.WithTimeoutCause(rootCtx, 1*time.Second, errors.New("too slow")) ) defer cxl() if err := run(ctx); err != nil { log.Fatal(err) } } func run(_ context.Context) error { var ( opt = &slog.HandlerOptions{ // // ReplaceAttr フィールドにカスタム関数を設定することで // 属性が出力される際の挙動をフックすることが出来る. // // 以下のシグネチャを持つ関数をセットする // func([]string, slog.Attr) slog.Attr // // 例えば、パスワードなどの秘匿情報をログ出力してしまわないように // ここでマスキングしてしまうなど。 // ReplaceAttr: replaceAttr, } writer = os.Stdout handler = slog.NewJSONHandler(writer, opt) rootLogger = slog.New(handler) logger = rootLogger.With() ) logger.Info("passwordフィールドはマスクされる", slog.String(PasswordKey, "12345")) return nil } func replaceAttr(group []string, a slog.Attr) slog.Attr { switch a.Key { case slog.TimeKey: a = slog.Attr{} case PasswordKey: a.Value = slog.StringValue("********") } return a }
実行すると以下のように出力されます。
Taskfile.yml
# https://taskfile.dev version: '3' tasks: default: cmds: - task: run run: cmds: - go run main.go | jq .
shell
$ task task: [run] go run main.go | jq . { "level": "INFO", "msg": "passwordフィールドはマスクされる", "password": "********" }
try-golang/examples/slog at main · devlights/try-golang · GitHub
参考情報
- Structured Logging with slog
- log/slog
- A Guide to Writing slog Handlers
- awesome-slog
- Goのslog使い方まとめ
- Go1.21で登場したlog/slogパッケージのパフォーマンスを徹底解説!!
- Go1.21 log/slogパッケージ超入門
- Go公式の構造化ロガー(として提案されている)slogを触ってみたメモ
- slog を触る(Group, Context)
- 構造化ログと実装 -Goのslogによる実践-
Goのおすすめ書籍
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。