package logging import ( "encoding/json" "fmt" "os" "path/filepath" lib "git.sr.ht/~cco/go-scopes" "git.sr.ht/~cco/go-scopes/config" "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{ "debug": DebugLevel, "info": InfoLevel, "warn": WarnLevel, "error": ErrorLevel, } type Logger = zerolog.Logger var defaultLogger = log.Logger.Level(InfoLevel) var globalLogger *Logger = &log.Logger type Cfg struct { *config.BaseCfg Logfile string Level string } func SetDefault() { logger := defaultLogger globalLogger = &logger } 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().Caller().Logger() 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 } // processing and printing of log data func Parse(rec string) map[string]interface{} { var buf map[string]interface{} if err := json.Unmarshal([]byte(rec), &buf); err != nil { fmt.Println("logging.Parse:", err) } return buf }