package log import ( "os" "github.com/rs/zerolog" ) const ( DebugLevel Level = "debug" ReleaseLevel Level = "release" BenchmarkLevel Level = "benchmark" ) const ( DefaultDisplay Display = "json" JsonDisplay Display = "json" ConsoleDisplay Display = "console" ) const ( FileMode Mode = "file" ConsoleMode Mode = "console" ) type Level string type Display string type Mode string type Config struct { Level Level Mode Mode Path string Display Display } func Init(cfg Config) (zerolog.Logger, error) { var logger = zerolog.New(os.Stdout).With().Timestamp().Logger() switch cfg.Display { case ConsoleDisplay: logger = logger.Output(zerolog.ConsoleWriter{Out: os.Stdout}) default: } switch cfg.Mode { case ConsoleMode: case FileMode: fp, err := createLogFile(cfg.Path) if err != nil { return logger, err } logger = logger.Output(fp) default: } //set log level switch cfg.Level { case DebugLevel: zerolog.SetGlobalLevel(zerolog.DebugLevel) case ReleaseLevel: zerolog.SetGlobalLevel(zerolog.InfoLevel) case BenchmarkLevel: zerolog.SetGlobalLevel(zerolog.Disabled) default: zerolog.SetGlobalLevel(zerolog.InfoLevel) } return logger, nil } var fds = make([]*os.File, 0) func createLogFile(path string) (*os.File, error) { f, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_RDWR, os.ModePerm) if err != nil { return nil, err } //defer f.Close() fds = append(fds, f) return f, nil } func Close() { for _, fd := range fds { fd.Close() } }