github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/log/log.go (about) 1 package log 2 3 import ( 4 "fmt" 5 "github.com/angenalZZZ/gofunc/f" 6 "github.com/rs/zerolog" 7 "gopkg.in/natefinch/lumberjack.v2" 8 "io" 9 "strings" 10 "time" 11 ) 12 13 // Log default logger, or use log of import "github.com/rs/zerolog/log" 14 var Log *Logger 15 16 // Logger *zerolog.Logger 17 type Logger = zerolog.Logger 18 19 // Init the global zero logger. 20 func init() { 21 zerolog.CallerFieldName = "c" // default: caller 22 zerolog.ErrorFieldName = "e" // default: error 23 zerolog.ErrorStackFieldName = "s" // default: stack 24 zerolog.LevelFieldName = "l" // default: level 25 zerolog.MessageFieldName = "m" // default: message 26 zerolog.TimestampFieldName = "t" // default: time 27 28 zerolog.DurationFieldInteger = true 29 zerolog.DurationFieldUnit = time.Millisecond 30 //zerolog.TimeFieldFormat = zerolog.TimeFormatUnix 31 //zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack // Enable stack trace 32 } 33 34 // Init the zero logger. 35 func Init(c *Config) *Logger { 36 // sets the global override for log level and time format. 37 //if level, err := zerolog.ParseLevel(c.Level); err == nil { 38 // zerolog.SetGlobalLevel(level) 39 //} 40 if c.TimeFormat != "" { 41 zerolog.TimeFieldFormat = c.TimeFormat 42 } 43 // configs writers 44 var writers []io.Writer 45 if strings.Contains(c.Writers, "file") { 46 w := &lumberjack.Logger{ 47 Filename: c.Filename, 48 MaxSize: c.MaxSize, 49 MaxAge: c.MaxAge, 50 MaxBackups: c.MaxBackups, 51 LocalTime: c.LocalTime, 52 Compress: c.Compress, 53 } 54 writers = append(writers, w) 55 } 56 if strings.Contains(c.Writers, "stdout") { 57 w := newConsole(zerolog.TimeFieldFormat, false) 58 writers = append(writers, w) 59 } 60 w := io.MultiWriter(writers...) 61 z := zerolog.New(w).With().Timestamp() 62 l := z.Logger() 63 if level, err := zerolog.ParseLevel(c.Level); err == nil { 64 l = l.Level(level) 65 } 66 return &l 67 } 68 69 // InitConsole zero console logger. 70 func InitConsole(timeFormat string, jsonWriter bool) *Logger { 71 w := newConsole(timeFormat, jsonWriter) 72 l := zerolog.New(w).With().Timestamp().Logger() 73 return &l 74 } 75 76 func newConsole(timeFormat string, jsonWriter bool) io.Writer { 77 w := zerolog.NewConsoleWriter() 78 w.TimeFormat = timeFormat 79 w.NoColor = true // NoColor to Improve efficiency 80 if jsonWriter { 81 return w 82 } 83 setConsoleWriterFormat(&w) 84 return &w 85 } 86 87 func newFileWriter(writer io.Writer, timeFormat string) io.Writer { 88 w := &zerolog.ConsoleWriter{Out: writer} 89 setConsoleWriterFormat(w) 90 return w 91 } 92 93 func setConsoleWriterFormat(w *zerolog.ConsoleWriter) { 94 // https://github.com/rs/zerolog/blob/master/console.go#L315 95 w.FormatLevel = func(i interface{}) string { 96 return fmt.Sprintf(`[%s]`, i) 97 } 98 w.FormatFieldName = func(i interface{}) string { 99 return fmt.Sprintf(`"%s":`, i) 100 } 101 w.FormatFieldValue = f.ToString 102 w.FormatMessage = f.ToString 103 }