ログ出力は大事で、何か問題が起こった時に調査する時とても大事です。
ただ、個人情報など出力したらセキュリティ的に困る場合があるので、 個人情報をマスクする方法は大事になってきます。
今回は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}}