うさぎ小屋(仮)

📅  2021-12-12

loggerで出力する際にマスクしたい項目をマスクする(zap)


ログ出力は大事で、何か問題が起こった時に調査する時とても大事です。

ただ、個人情報など出力したらセキュリティ的に困る場合があるので、 個人情報をマスクする方法は大事になってきます。

今回はuber製loggerのzapを使ったオブジェクトのマスク方法を紹介します。

package main

import (
	"time"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

const MASKED_STR = "********"

type user struct {
	ID        string
	Name      string // 個人情報
	Email     string // 個人情報
	CreatedAt time.Time
}

// zapを使った構造体のマスク方法
func (u user) MarshalLogObject(enc zapcore.ObjectEncoder) error {
	enc.AddString("id", u.ID)
	enc.AddString("name", MASKED_STR)
	enc.AddString("email", MASKED_STR)
	enc.AddInt64("created_at", u.CreatedAt.UnixNano())
	return nil
}

func main() {
	logger, _ := zap.NewDevelopment()
	user := &user{
		ID:        "9d3d893d9d3daofa",
		Name:      "Zap",
		Email:     "zap@sample.com",
		CreatedAt: time.Now(),
	}
	logger.Info("object log sample", zap.Object("user", user))
}

zapではログ出力したい構造体に MarshalLogObjectのメソッドを実装することで、ログ出力したい内容をコントロールすることができます。

上記の実装で実行した場合、以下のように出力されます。

2021-12-12T12:00:55.847+0900	INFO	try-golang/main.go:36	object log sample	{"user": {"id": "9d3d893d9d3daofa", "name": "********", "email": "********", "created_at": 1639278055847729000}}