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