go-scopes/logging/logging.go

98 lines
2 KiB
Go

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
}