github.com/zhiqiangxu/util@v0.0.0-20230112053021-0a7aee056cd5/logger/prod.go (about) 1 package logger 2 3 import ( 4 "fmt" 5 "sync" 6 "sync/atomic" 7 "unsafe" 8 9 "go.uber.org/zap" 10 "go.uber.org/zap/zapcore" 11 ) 12 13 var ( 14 prodLoggerPtr unsafe.Pointer 15 prodMU sync.Mutex 16 ) 17 18 // ProdInstance returns the instance for production environment 19 func ProdInstance() *zap.Logger { 20 prodLogger := atomic.LoadPointer(&prodLoggerPtr) 21 if prodLogger != nil { 22 return (*zap.Logger)(prodLogger) 23 } 24 25 prodMU.Lock() 26 defer prodMU.Unlock() 27 prodLogger = atomic.LoadPointer(&prodLoggerPtr) 28 if prodLogger != nil { 29 return (*zap.Logger)(prodLogger) 30 } 31 32 encoderConfig := zap.NewProductionEncoderConfig() 33 encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder 34 encoderConfig.EncodeDuration = zapcore.StringDurationEncoder 35 36 zconf := zap.Config{ 37 DisableCaller: true, 38 DisableStacktrace: true, 39 Level: zap.NewAtomicLevelAt(zapcore.InfoLevel), 40 Development: false, 41 Encoding: "json", 42 EncoderConfig: encoderConfig, 43 OutputPaths: []string{"stdout"}, 44 ErrorOutputPaths: []string{"stderr"}, 45 } 46 47 prodLoggerType, err := New(zconf) 48 if err != nil { 49 panic(fmt.Sprintf("ProdInstance New:%v", err)) 50 } 51 52 atomic.StorePointer(&prodLoggerPtr, unsafe.Pointer(prodLoggerType)) 53 54 return prodLoggerType 55 }