github.com/zhiqiangxu/util@v0.0.0-20230112053021-0a7aee056cd5/logger/dev.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  	devLoggerPtr unsafe.Pointer
    15  	devMU        sync.Mutex
    16  )
    17  
    18  // DevInstance returns the instance for develop environment
    19  func DevInstance() *zap.Logger {
    20  	devLogger := atomic.LoadPointer(&devLoggerPtr)
    21  	if devLogger != nil {
    22  		return (*zap.Logger)(devLogger)
    23  	}
    24  
    25  	devMU.Lock()
    26  	defer devMU.Unlock()
    27  	devLogger = atomic.LoadPointer(&devLoggerPtr)
    28  	if devLogger != nil {
    29  		return (*zap.Logger)(devLogger)
    30  	}
    31  
    32  	encoderConfig := zap.NewDevelopmentEncoderConfig()
    33  
    34  	zconf := zap.Config{
    35  		DisableCaller:     true,
    36  		DisableStacktrace: true,
    37  		Level:             zap.NewAtomicLevelAt(zapcore.DebugLevel),
    38  		Development:       true,
    39  		Encoding:          "json",
    40  		EncoderConfig:     encoderConfig,
    41  		OutputPaths:       []string{"stdout"},
    42  		ErrorOutputPaths:  []string{"stderr"},
    43  	}
    44  
    45  	devLoggerType, err := New(zconf)
    46  	if err != nil {
    47  		panic(fmt.Sprintf("DevInstance New:%v", err))
    48  	}
    49  
    50  	atomic.StorePointer(&devLoggerPtr, unsafe.Pointer(devLoggerType))
    51  
    52  	return devLoggerType
    53  }