Add common logger helper

This commit is contained in:
Ask Bjørn Hansen 2023-07-01 19:57:36 -07:00
parent cf61f70d95
commit cc6a6c0320
5 changed files with 140 additions and 0 deletions

2
go.mod
View File

@ -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
View 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
View 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
View 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
View 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"
}