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  }