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  }