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 }