いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-487 (slogメモ-10)(機密情報などのマスキング)

関連記事

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

参考情報

Goのおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。