package logging import ( "os" "path/filepath" "git.sr.ht/~cco/go-scopes/config" "git.sr.ht/~cco/go-scopes/lib" "github.com/rs/zerolog" "github.com/rs/zerolog/log" ) const ( DebugLevel = zerolog.DebugLevel InfoLevel = zerolog.InfoLevel WarnLevel = zerolog.WarnLevel ErrorLevel = zerolog.ErrorLevel ) var Levels = map[string]zerolog.Level{} type Logger = zerolog.Logger var globalLogger *Logger = &log.Logger type Cfg struct { *config.BaseCfg Logfile string Level string } func Setup(ctx lib.Context, cfg *Cfg, home string) { if cfg == nil { return // use unchanged predefined logger } if logger, err := New(cfg, home); err != nil { panic("error when trying to set up logger.") } else { *globalLogger = *logger } } func New(cfg *Cfg, home string) (*Logger, error) { home, _ = filepath.Abs(home) fn := cfg.Logfile if fn == "" { fn = filepath.Join(home, "log", "scopes.log") } else if !filepath.IsAbs(fn) { fn = filepath.Join(home, fn) } f, err := os.OpenFile(fn, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0664) if err != nil { GetLogger(nil).Err(err).Msg("logging.New: open log file") return nil, err } logger := zerolog.New(f).With().Timestamp().Logger() if cfg.Level != "" { if lvl, ok := Levels[cfg.Level]; ok { logger = logger.Level(lvl) } else { GetLogger(nil).Warn().Str("level", cfg.Level). Msg("logging.New: undefined level") } } return &logger, nil } func GetLogger(ctx lib.Context) *Logger { if ctx == nil { return globalLogger } // return ctx.Logger() return globalLogger } func init() { Levels["debug"] = DebugLevel Levels["info"] = InfoLevel Levels["warn"] = WarnLevel Levels["error"] = ErrorLevel }