98 lines
2 KiB
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
|
|
}
|