zapcore.Field を生成する関数を自分で定義する

uber-go/zap: Blazing fast structured leveled logging in Go.

zap を使ってログを出すときに自分でフィールドを追加できる。

こういう雰囲気で。

logger.Info(
    "invalid address",
    zap.String("address" address)
)

このとき zap.String って書いているけど、これを自分で定義できるのかな?と zap のソースコードを読んだりしてたらできそうなことがわかった。
でもって試したのが、これ。

sters/zap-hashed-field: Define hashed zapcore.Field

具体的なユースケースがわからんけど、例えば入力されたデータをもとに動きを追いかけたい、とか、なにがしかの都合で、センシティブなデータ(パスワード、メールや電話番号、トークン値、…etc)を出したいときがある、と思う。そういうときに使えるんじゃね?的な妄想をしながら作った。

こういう風に使ってハッシュ値にして出力できる。

logger.Info(
    "invalid address",
    hashedfield.Sha1("address" address)
)

 

これをどうやってやるかっていうと、単に zapcore.Field が構造体になっているので、それを生成して zap.Logger で出力する場所に渡してあげるだけでよかった。

zapcore.Field は以下のようなフィールドを持っている。
zap/field.go at master · uber-go/zap

type Field struct {
	Key       string
	Type      FieldType
	Integer   int64
	String    string
	Interface interface{}
}

このとき Type に指定したものに応じて zap.Logger がよろしく値を変換して出力してくれる。文字列を出したいなら StringType を指定して String フィールドに値を入れればよい。
zap.String がまさにそう。
zap/field.go at master · uber-go/zap

func String(key string val string) Field {
	return Field{Key: key Type: zapcore.StringType String: val}
}

 

使い方のサンプルってどうやって書いたらいいのかなあと思いながら zap のコードを眺めていたら
examples_test.go というファイルがいて、なんだろうな、と。

zap/example_test.go at master · uber-go/zap

そこから調べてたら Examples Test を知った。

Testable Examples in Go - The Go Blog

要するに、テストコードの最後に期待する出力をコメントで書いておくと出力を内部でハンドリング、比較して様子を見てくれるとのこと。
便利~~~~。

前後の記事

Next:
Prev: