golang zap logger - foolmacky/DevelopDocs GitHub Wiki

■zap loggerでテストなどの際に複数のgoroutineからエラーをbufferに出力する

  • bytes.BufferにWriteをかけたいと思うが、bytes.Bufferはconcurrent safeではないので、複数のgoroutineから出力する場合などは、独自にlock制御を実装する必要がある
type lockBuff struct {
    sync.Mutex
    ws zapcore.WriteSyncer
}

func newLockedBuff(b *bytes.Buffer) *lockedBuff {
    return &lockedBuff{ ws: zapcore.AddSync(b)}
}

func(lb *lockedBuff) Write(bs []byte) (int error) {
    lb.Lock()
    n, err := lb.ws.Write(bs)
    lb.Unlock()
    return n, err
}

func(lb *lockedBuff) Sync() error {
    lb.Lock()
    err := lb.ws.Sync()
    lb.Unlock()
    return err
}

//このstructを使う
lb := newLockedBuff(buf)
w := zapcore.NewMultiWriteSyncer(os.Stdout, lb)
c := zapcore.NewCore(
    zapcore.NewConsoleEncoder(cfg),
    zapcore.AddSync(writer),
    cfglevel,
)
   :