gosuki/internal/logging/log.go
2023-09-10 01:14:13 +02:00

110 lines
3.1 KiB
Go

package logging
import (
"os"
glogging "github.com/op/go-logging"
)
type Logger = glogging.Logger
const (
debugDefaultFmt = `%{color} %{time:15:04:05.000} %{level:.4s} %{shortfunc:.10s}: %{color:reset} %{message}`
debugFmt = `%{color} %{time:15:04:05.000} %{level:.4s} [%{module:.4s}] %{shortfile}:%{shortfunc:.10s}: %{color:reset} %{message}`
releaseFmt = `%{color}[%{level:.4s}]%{color:reset} %{message}`
)
var (
stdoutBackend = glogging.NewLogBackend(os.Stderr, "", 0)
nullBackend = glogging.NewLogBackend(new(NullWriter), "", 0)
debugFormatter = glogging.MustStringFormatter(debugFmt)
debugDefaultFormatter = glogging.MustStringFormatter(debugDefaultFmt)
releaseFormatter = glogging.MustStringFormatter(releaseFmt)
debugBackend = glogging.NewBackendFormatter(stdoutBackend, debugFormatter)
debugDefaultBackend = glogging.NewBackendFormatter(stdoutBackend, debugDefaultFormatter)
releaseBackend = glogging.NewBackendFormatter(stdoutBackend, releaseFormatter)
silentBackend = glogging.NewBackendFormatter(nullBackend, debugDefaultFormatter)
loggers map[string]*glogging.Logger
// Default debug leveledBacked
leveledDefaultDebug = glogging.AddModuleLevel(debugDefaultBackend)
leveledDebug = glogging.AddModuleLevel(debugBackend)
leveledRelease = glogging.AddModuleLevel(releaseBackend)
leveledSilent = glogging.AddModuleLevel(silentBackend)
LoggingLevels = map[int]int{
Release: int(glogging.WARNING),
Info: int(glogging.INFO),
Debug: int(glogging.DEBUG),
}
)
type NullWriter struct{}
func (nw *NullWriter) Write(p []byte) (n int, err error) {
return len(p), nil
}
func GetLogger(module string) *glogging.Logger {
logger := glogging.MustGetLogger(module)
if len(module) > 0 {
loggers[module] = logger
} else {
loggers["default"] = logger
}
if LoggingMode >= Info {
// fmt.Println("setting backend to >= info")
if len(module) > 0 {
logger.SetBackend(leveledDebug)
} else {
logger.SetBackend(leveledDefaultDebug)
}
} else {
// fmt.Println("setting backend to release")
logger.SetBackend(leveledRelease)
}
// setting log level for logger
glogging.SetLevel(glogging.Level(LoggingLevels[LoggingMode]), module)
// Register which loggers to use
return logger
}
func setLogLevel(lvl int) {
for k, logger := range loggers {
// fmt.Printf("setting log level to:%v for %v\n ", LoggingLevels[lvl], k)
glogging.SetLevel(glogging.Level(LoggingLevels[lvl]), k)
if lvl >= Info {
// fmt.Println("setting backend to debug for ", k)
logger.SetBackend(leveledDebug)
} else if lvl == -1 {
logger.SetBackend(leveledSilent)
} else {
logger.SetBackend(leveledRelease)
// fmt.Println("setting backend to release for ", k)
}
}
}
//FIX: Suppress output during testing
func init() {
initRuntimeMode()
// init global vars
loggers = make(map[string]*glogging.Logger)
// Sets the default backend for all new loggers
//RELEASE: set to release when app released
glogging.SetBackend(debugBackend)
// Release level
leveledRelease.SetLevel(glogging.WARNING, "")
}