go-scopes/logging/logging.go

95 lines
1.9 KiB
Go

package logging
import (
"encoding/json"
"fmt"
"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
}
// 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
}
// set up static data
func init() {
Levels["debug"] = DebugLevel
Levels["info"] = InfoLevel
Levels["warn"] = WarnLevel
Levels["error"] = ErrorLevel
}