package log import ( "fmt" "github.com/zeromicro/go-zero/core/logx" "go.uber.org/zap" ) const callerSkipOffset = 3 type ZapWriter struct { logger *zap.Logger } func NewZapWriter(opts ...zap.Option) logx.Writer { opts = append(opts, zap.AddCallerSkip(callerSkipOffset)) logger, _ := zap.NewProduction(opts...) defer logger.Sync() return &ZapWriter{ logger: logger, } } func (w *ZapWriter) Alert(v interface{}) { w.logger.Error(fmt.Sprint(v)) } func (w *ZapWriter) Close() error { return w.logger.Sync() } func (w *ZapWriter) Debug(v interface{}, fields ...logx.LogField) { w.logger.Debug(fmt.Sprint(v), toZapFields(fields...)...) } func (w *ZapWriter) Error(v interface{}, fields ...logx.LogField) { w.logger.Error(fmt.Sprint(v), toZapFields(fields...)...) } func (w *ZapWriter) Info(v interface{}, fields ...logx.LogField) { w.logger.Info(fmt.Sprint(v), toZapFields(fields...)...) } func (w *ZapWriter) Severe(v interface{}) { w.logger.Fatal(fmt.Sprint(v)) } func (w *ZapWriter) Slow(v interface{}, fields ...logx.LogField) { w.logger.Warn(fmt.Sprint(v), toZapFields(fields...)...) } func (w *ZapWriter) Stack(v interface{}) { w.logger.Error(fmt.Sprint(v), zap.Stack("stack")) } func (w *ZapWriter) Stat(v interface{}, fields ...logx.LogField) { w.logger.Info(fmt.Sprint(v), toZapFields(fields...)...) } func toZapFields(fields ...logx.LogField) []zap.Field { zapFields := make([]zap.Field, 0, len(fields)) for _, f := range fields { zapFields = append(zapFields, zap.Any(f.Key, f.Value)) } return zapFields }