Add common logger helper
This commit is contained in:
parent
cf61f70d95
commit
cc6a6c0320
2
go.mod
2
go.mod
@ -1,3 +1,5 @@
|
||||
module go.ntppool.org/common
|
||||
|
||||
go 1.20
|
||||
|
||||
require golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df
|
||||
|
2
go.sum
Normal file
2
go.sum
Normal file
@ -0,0 +1,2 @@
|
||||
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME=
|
||||
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
|
82
logger/logger.go
Normal file
82
logger/logger.go
Normal file
@ -0,0 +1,82 @@
|
||||
package logger
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
"sync"
|
||||
|
||||
"golang.org/x/exp/slog"
|
||||
)
|
||||
|
||||
var ConfigPrefix = ""
|
||||
|
||||
var rootLogger *slog.Logger
|
||||
var setup sync.Once
|
||||
|
||||
func Setup() *slog.Logger {
|
||||
|
||||
setup.Do(func() {
|
||||
|
||||
var programLevel = new(slog.LevelVar) // Info by default
|
||||
|
||||
envVar := "DEBUG"
|
||||
if len(ConfigPrefix) > 0 {
|
||||
envVar = ConfigPrefix + "_" + envVar
|
||||
}
|
||||
|
||||
if opt := os.Getenv(envVar); len(opt) > 0 {
|
||||
if debug, _ := strconv.ParseBool(opt); debug {
|
||||
programLevel.Set(slog.LevelDebug)
|
||||
}
|
||||
}
|
||||
|
||||
logOptions := &slog.HandlerOptions{Level: programLevel}
|
||||
|
||||
if len(os.Getenv("INVOCATION_ID")) > 0 {
|
||||
// don't add timestamps when running under systemd
|
||||
log.Default().SetFlags(0)
|
||||
|
||||
logReplace := func(groups []string, a slog.Attr) slog.Attr {
|
||||
// Remove time
|
||||
if a.Key == slog.TimeKey && len(groups) == 0 {
|
||||
a.Key = ""
|
||||
a.Value = slog.AnyValue(nil)
|
||||
}
|
||||
return a
|
||||
}
|
||||
|
||||
logOptions.ReplaceAttr = logReplace
|
||||
}
|
||||
|
||||
logHandler := slog.NewTextHandler(os.Stderr, logOptions)
|
||||
|
||||
// https://github.com/cyrusaf/ctxlog/pull/1
|
||||
// log := slog.New(ctxlog.NewHandler(logHandler))
|
||||
log := slog.New(logHandler)
|
||||
|
||||
slog.SetDefault(log)
|
||||
|
||||
rootLogger = log
|
||||
|
||||
})
|
||||
|
||||
return rootLogger
|
||||
}
|
||||
|
||||
type loggerKey struct{}
|
||||
|
||||
// NewContext adds the logger to the context.
|
||||
func NewContext(ctx context.Context, l *slog.Logger) context.Context {
|
||||
return context.WithValue(ctx, loggerKey{}, l)
|
||||
}
|
||||
|
||||
// FromContext retrieves a logger from the context. If there is none,
|
||||
// it returns the default logger.
|
||||
func FromContext(ctx context.Context) *slog.Logger {
|
||||
if l, ok := ctx.Value(loggerKey{}).(*slog.Logger); ok {
|
||||
return l
|
||||
}
|
||||
return Setup()
|
||||
}
|
37
logger/stdlog.go
Normal file
37
logger/stdlog.go
Normal file
@ -0,0 +1,37 @@
|
||||
package logger
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"golang.org/x/exp/slog"
|
||||
)
|
||||
|
||||
type stdLoggerish struct {
|
||||
key string
|
||||
log *slog.Logger
|
||||
f func(string, ...any)
|
||||
}
|
||||
|
||||
func NewStdLog(key string, debug bool, log *slog.Logger) *stdLoggerish {
|
||||
if log == nil {
|
||||
log = Setup()
|
||||
}
|
||||
sl := &stdLoggerish{
|
||||
key: key,
|
||||
log: log,
|
||||
}
|
||||
sl.f = log.Info
|
||||
if debug {
|
||||
sl.f = log.Debug
|
||||
}
|
||||
|
||||
return sl
|
||||
}
|
||||
|
||||
func (l stdLoggerish) Println(msg ...interface{}) {
|
||||
l.f(l.key, "msg", msg)
|
||||
}
|
||||
|
||||
func (l stdLoggerish) Printf(msg string, args ...interface{}) {
|
||||
l.f(l.key, "msg", fmt.Sprintf(msg, args...))
|
||||
}
|
17
logger/type.go
Normal file
17
logger/type.go
Normal file
@ -0,0 +1,17 @@
|
||||
package logger
|
||||
|
||||
type Error struct {
|
||||
Msg string
|
||||
Data []any
|
||||
}
|
||||
|
||||
func NewError(msg string, data ...any) *Error {
|
||||
return &Error{
|
||||
Msg: msg,
|
||||
Data: data,
|
||||
}
|
||||
}
|
||||
|
||||
func (e *Error) Error() string {
|
||||
return "not implemented"
|
||||
}
|
Loading…
Reference in New Issue
Block a user