github.com/0chain/gosdk@v1.17.11/zcnbridge/log/logging.go (about)

     1  package log
     2  
     3  import (
     4  	"os"
     5  
     6  	"go.uber.org/zap"
     7  	"go.uber.org/zap/zapcore"
     8  	"gopkg.in/natefinch/lumberjack.v2"
     9  
    10  	"github.com/0chain/gosdk/zcnbridge/errors"
    11  )
    12  
    13  var (
    14  	// Logger represents main logger implementation used in app.
    15  	Logger = zap.NewNop()
    16  
    17  	// logName
    18  	logName string
    19  )
    20  
    21  // InitLogging initializes the main Logger consistent with passed log directory and level.
    22  //
    23  // If an error occurs during execution, the program terminates with code 2 and the error will be written in os.Stderr.
    24  //
    25  // InitLogging should be used only once while application is starting.
    26  func InitLogging(development bool, logDir, level string) {
    27  	logName = logDir + "/" + "logs.log"
    28  	var (
    29  		logWriter = getWriteSyncer(logName)
    30  		logCfg    zap.Config
    31  	)
    32  
    33  	if development {
    34  		logCfg = zap.NewProductionConfig()
    35  		logCfg.DisableCaller = true
    36  	} else {
    37  		logCfg = zap.NewDevelopmentConfig()
    38  		logCfg.EncoderConfig.LevelKey = "level"
    39  		logCfg.EncoderConfig.NameKey = "name"
    40  		logCfg.EncoderConfig.MessageKey = "msg"
    41  		logCfg.EncoderConfig.CallerKey = "caller"
    42  		logCfg.EncoderConfig.StacktraceKey = "stacktrace"
    43  
    44  		logWriter = zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), logWriter)
    45  	}
    46  	_ = logCfg.Level.UnmarshalText([]byte(level))
    47  	logCfg.Encoding = consoleEncoderType
    48  	logCfg.EncoderConfig.TimeKey = "timestamp"
    49  	logCfg.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
    50  
    51  	l, err := logCfg.Build(setOutput(logWriter, logCfg))
    52  	if err != nil {
    53  		errors.ExitErr("error while build logger config", err, 2)
    54  	}
    55  
    56  	Logger = l
    57  }
    58  
    59  const (
    60  	jsonEncoderType    = "json"
    61  	consoleEncoderType = "console"
    62  )
    63  
    64  // setOutput replaces existing Core with new, that writes to passed zapcore.WriteSyncer.
    65  func setOutput(ws zapcore.WriteSyncer, conf zap.Config) zap.Option {
    66  	var enc zapcore.Encoder
    67  	switch conf.Encoding {
    68  	case jsonEncoderType:
    69  		enc = zapcore.NewJSONEncoder(conf.EncoderConfig)
    70  	case consoleEncoderType:
    71  		enc = zapcore.NewConsoleEncoder(conf.EncoderConfig)
    72  	default:
    73  		errors.ExitMsg("error while build logger config", 2)
    74  	}
    75  
    76  	return zap.WrapCore(func(core zapcore.Core) zapcore.Core {
    77  		return zapcore.NewCore(enc, ws, conf.Level)
    78  	})
    79  }
    80  
    81  // getWriteSyncer creates zapcore.WriteSyncer using provided log file.
    82  func getWriteSyncer(logName string) zapcore.WriteSyncer {
    83  	var ioWriter = &lumberjack.Logger{
    84  		Filename:   logName,
    85  		MaxSize:    10, // MB
    86  		MaxBackups: 3,  // number of backups
    87  		MaxAge:     28, // days
    88  		LocalTime:  true,
    89  		Compress:   false, // disabled by default
    90  	}
    91  	_ = ioWriter.Rotate()
    92  	return zapcore.AddSync(ioWriter)
    93  }