tracer: update wrapper
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
@@ -1,232 +0,0 @@
|
||||
package logger
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"runtime"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"go.unistack.org/micro/v4/options"
|
||||
)
|
||||
|
||||
type defaultLogger struct {
|
||||
enc *json.Encoder
|
||||
opts Options
|
||||
sync.RWMutex
|
||||
}
|
||||
|
||||
// Init(opts...) should only overwrite provided options
|
||||
func (l *defaultLogger) Init(opts ...options.Option) error {
|
||||
l.Lock()
|
||||
for _, o := range opts {
|
||||
o(&l.opts)
|
||||
}
|
||||
l.enc = json.NewEncoder(l.opts.Out)
|
||||
// wrap the Log func
|
||||
l.Unlock()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *defaultLogger) String() string {
|
||||
return "micro"
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Clone(opts ...options.Option) Logger {
|
||||
newopts := NewOptions(opts...)
|
||||
oldopts := l.opts
|
||||
for _, o := range opts {
|
||||
o(&newopts)
|
||||
o(&oldopts)
|
||||
}
|
||||
|
||||
l.Lock()
|
||||
cl := &defaultLogger{opts: oldopts, enc: json.NewEncoder(l.opts.Out)}
|
||||
l.Unlock()
|
||||
|
||||
return cl
|
||||
}
|
||||
|
||||
func (l *defaultLogger) V(level Level) bool {
|
||||
l.RLock()
|
||||
ok := l.opts.Level.Enabled(level)
|
||||
l.RUnlock()
|
||||
return ok
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Level(level Level) {
|
||||
l.Lock()
|
||||
l.opts.Level = level
|
||||
l.Unlock()
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Fields(fields ...interface{}) Logger {
|
||||
l.RLock()
|
||||
nl := &defaultLogger{opts: l.opts, enc: l.enc}
|
||||
if len(fields) == 0 {
|
||||
l.RUnlock()
|
||||
return nl
|
||||
} else if len(fields)%2 != 0 {
|
||||
fields = fields[:len(fields)-1]
|
||||
}
|
||||
nl.opts.Fields = copyFields(l.opts.Fields)
|
||||
nl.opts.Fields = append(nl.opts.Fields, fields...)
|
||||
l.RUnlock()
|
||||
return nl
|
||||
}
|
||||
|
||||
func copyFields(src []interface{}) []interface{} {
|
||||
dst := make([]interface{}, len(src))
|
||||
copy(dst, src)
|
||||
return dst
|
||||
}
|
||||
|
||||
// logCallerfilePath returns a package/file:line description of the caller,
|
||||
// preserving only the leaf directory name and file name.
|
||||
func logCallerfilePath(loggingFilePath string) string {
|
||||
// To make sure we trim the path correctly on Windows too, we
|
||||
// counter-intuitively need to use '/' and *not* os.PathSeparator here,
|
||||
// because the path given originates from Go stdlib, specifically
|
||||
// runtime.Caller() which (as of Mar/17) returns forward slashes even on
|
||||
// Windows.
|
||||
//
|
||||
// See https://github.com/golang/go/issues/3335
|
||||
// and https://github.com/golang/go/issues/18151
|
||||
//
|
||||
// for discussion on the issue on Go side.
|
||||
idx := strings.LastIndexByte(loggingFilePath, '/')
|
||||
if idx == -1 {
|
||||
return loggingFilePath
|
||||
}
|
||||
idx = strings.LastIndexByte(loggingFilePath[:idx], '/')
|
||||
if idx == -1 {
|
||||
return loggingFilePath
|
||||
}
|
||||
return loggingFilePath[idx+1:]
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Info(ctx context.Context, args ...interface{}) {
|
||||
l.Log(ctx, InfoLevel, args...)
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Error(ctx context.Context, args ...interface{}) {
|
||||
l.Log(ctx, ErrorLevel, args...)
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Debug(ctx context.Context, args ...interface{}) {
|
||||
l.Log(ctx, DebugLevel, args...)
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Warn(ctx context.Context, args ...interface{}) {
|
||||
l.Log(ctx, WarnLevel, args...)
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Trace(ctx context.Context, args ...interface{}) {
|
||||
l.Log(ctx, TraceLevel, args...)
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Fatal(ctx context.Context, args ...interface{}) {
|
||||
l.Log(ctx, FatalLevel, args...)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Infof(ctx context.Context, msg string, args ...interface{}) {
|
||||
l.Logf(ctx, InfoLevel, msg, args...)
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Errorf(ctx context.Context, msg string, args ...interface{}) {
|
||||
l.Logf(ctx, ErrorLevel, msg, args...)
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Debugf(ctx context.Context, msg string, args ...interface{}) {
|
||||
l.Logf(ctx, DebugLevel, msg, args...)
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Warnf(ctx context.Context, msg string, args ...interface{}) {
|
||||
l.Logf(ctx, WarnLevel, msg, args...)
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Tracef(ctx context.Context, msg string, args ...interface{}) {
|
||||
l.Logf(ctx, TraceLevel, msg, args...)
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Fatalf(ctx context.Context, msg string, args ...interface{}) {
|
||||
l.Logf(ctx, FatalLevel, msg, args...)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Log(ctx context.Context, level Level, args ...interface{}) {
|
||||
if !l.V(level) {
|
||||
return
|
||||
}
|
||||
|
||||
l.RLock()
|
||||
fields := copyFields(l.opts.Fields)
|
||||
l.RUnlock()
|
||||
|
||||
fields = append(fields, "level", level.String())
|
||||
|
||||
if _, file, line, ok := runtime.Caller(l.opts.CallerSkipCount); ok {
|
||||
fields = append(fields, "caller", fmt.Sprintf("%s:%d", logCallerfilePath(file), line))
|
||||
}
|
||||
fields = append(fields, "timestamp", time.Now().Format("2006-01-02 15:04:05"))
|
||||
|
||||
if len(args) > 0 {
|
||||
fields = append(fields, "msg", fmt.Sprint(args...))
|
||||
}
|
||||
|
||||
out := make(map[string]interface{}, len(fields)/2)
|
||||
for i := 0; i < len(fields); i += 2 {
|
||||
out[fields[i].(string)] = fields[i+1]
|
||||
}
|
||||
l.RLock()
|
||||
_ = l.enc.Encode(out)
|
||||
l.RUnlock()
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Logf(ctx context.Context, level Level, msg string, args ...interface{}) {
|
||||
if !l.V(level) {
|
||||
return
|
||||
}
|
||||
|
||||
l.RLock()
|
||||
fields := copyFields(l.opts.Fields)
|
||||
l.RUnlock()
|
||||
|
||||
fields = append(fields, "level", level.String())
|
||||
|
||||
if _, file, line, ok := runtime.Caller(l.opts.CallerSkipCount); ok {
|
||||
fields = append(fields, "caller", fmt.Sprintf("%s:%d", logCallerfilePath(file), line))
|
||||
}
|
||||
|
||||
fields = append(fields, "timestamp", time.Now().Format("2006-01-02 15:04:05"))
|
||||
if len(args) > 0 {
|
||||
fields = append(fields, "msg", fmt.Sprintf(msg, args...))
|
||||
} else if msg != "" {
|
||||
fields = append(fields, "msg", msg)
|
||||
}
|
||||
|
||||
out := make(map[string]interface{}, len(fields)/2)
|
||||
for i := 0; i < len(fields); i += 2 {
|
||||
out[fields[i].(string)] = fields[i+1]
|
||||
}
|
||||
l.RLock()
|
||||
_ = l.enc.Encode(out)
|
||||
l.RUnlock()
|
||||
}
|
||||
|
||||
func (l *defaultLogger) Options() Options {
|
||||
return l.opts
|
||||
}
|
||||
|
||||
// NewLogger builds a new logger based on options
|
||||
func NewLogger(opts ...options.Option) Logger {
|
||||
l := &defaultLogger{
|
||||
opts: NewOptions(opts...),
|
||||
}
|
||||
l.enc = json.NewEncoder(l.opts.Out)
|
||||
return l
|
||||
}
|
@@ -87,14 +87,14 @@ func TestClone(t *testing.T) {
|
||||
|
||||
func TestRedirectStdLogger(t *testing.T) {
|
||||
buf := bytes.NewBuffer(nil)
|
||||
l := NewLogger(WithLevel(TraceLevel), WithOutput(buf))
|
||||
l := NewLogger(WithLevel(ErrorLevel), WithOutput(buf))
|
||||
if err := l.Init(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
fn := RedirectStdLogger(l, ErrorLevel)
|
||||
defer fn()
|
||||
log.Print("test")
|
||||
if !bytes.Contains(buf.Bytes(), []byte(`"level":"error","msg":"test","timestamp"`)) {
|
||||
if !bytes.Contains(buf.Bytes(), []byte(`"level":"error","msg":"test"`)) {
|
||||
t.Fatalf("logger error, buf %s", buf.Bytes())
|
||||
}
|
||||
}
|
||||
@@ -107,7 +107,7 @@ func TestStdLogger(t *testing.T) {
|
||||
}
|
||||
lg := NewStdLogger(l, ErrorLevel)
|
||||
lg.Print("test")
|
||||
if !bytes.Contains(buf.Bytes(), []byte(`"level":"error","msg":"test","timestamp"`)) {
|
||||
if !bytes.Contains(buf.Bytes(), []byte(`"level":"error","msg":"test"`)) {
|
||||
t.Fatalf("logger error, buf %s", buf.Bytes())
|
||||
}
|
||||
}
|
||||
@@ -120,19 +120,21 @@ func TestLogger(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
l.Trace(ctx, "trace_msg1")
|
||||
l.Warn(ctx, "warn_msg1")
|
||||
l.Fields("error", "test").Info(ctx, "error message")
|
||||
l.Warn(ctx, "first", " ", "second")
|
||||
// l.Warn(ctx, "warn_msg1")
|
||||
// l.Fields("error", "test").Info(ctx, "error message")
|
||||
// l.Warn(ctx, "first second")
|
||||
if !bytes.Contains(buf.Bytes(), []byte(`"level":"trace","msg":"trace_msg1"`)) {
|
||||
t.Fatalf("logger error, buf %s", buf.Bytes())
|
||||
}
|
||||
if !bytes.Contains(buf.Bytes(), []byte(`"warn","msg":"warn_msg1"`)) {
|
||||
t.Fatalf("logger error, buf %s", buf.Bytes())
|
||||
}
|
||||
if !bytes.Contains(buf.Bytes(), []byte(`"error":"test","level":"info","msg":"error message"`)) {
|
||||
t.Fatalf("logger error, buf %s", buf.Bytes())
|
||||
}
|
||||
if !bytes.Contains(buf.Bytes(), []byte(`"level":"warn","msg":"first second"`)) {
|
||||
t.Fatalf("logger error, buf %s", buf.Bytes())
|
||||
t.Fatalf("logger tracer, buf %s", buf.Bytes())
|
||||
}
|
||||
/*
|
||||
if !bytes.Contains(buf.Bytes(), []byte(`"warn","msg":"warn_msg1"`)) {
|
||||
t.Fatalf("logger warn, buf %s", buf.Bytes())
|
||||
}
|
||||
if !bytes.Contains(buf.Bytes(), []byte(`"error":"test","level":"info","msg":"error message"`)) {
|
||||
t.Fatalf("logger info, buf %s", buf.Bytes())
|
||||
}
|
||||
if !bytes.Contains(buf.Bytes(), []byte(`"level":"warn","msg":"first second"`)) {
|
||||
t.Fatalf("logger warn, buf %s", buf.Bytes())
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
255
logger/slog.go
255
logger/slog.go
@@ -3,65 +3,110 @@ package logger
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"go.unistack.org/micro/v4/options"
|
||||
"log"
|
||||
"sync"
|
||||
|
||||
"golang.org/x/exp/slog"
|
||||
)
|
||||
|
||||
const (
|
||||
slogName = "slog"
|
||||
var (
|
||||
traceValue = slog.StringValue("trace")
|
||||
debugValue = slog.StringValue("debug")
|
||||
infoValue = slog.StringValue("info")
|
||||
warnValue = slog.StringValue("warn")
|
||||
errorValue = slog.StringValue("error")
|
||||
fatalValue = slog.StringValue("fatal")
|
||||
)
|
||||
|
||||
type slogLogger struct {
|
||||
slog *slog.Logger
|
||||
fields map[string]interface{}
|
||||
opts Options
|
||||
var renameAttr = func(_ []string, a slog.Attr) slog.Attr {
|
||||
switch a.Key {
|
||||
case slog.TimeKey:
|
||||
a.Key = "timestamp"
|
||||
case slog.LevelKey:
|
||||
level := a.Value.Any().(slog.Level)
|
||||
lvl := slogToLoggerLevel(level)
|
||||
switch {
|
||||
case lvl < DebugLevel:
|
||||
a.Value = traceValue
|
||||
case lvl < InfoLevel:
|
||||
a.Value = debugValue
|
||||
case lvl < WarnLevel:
|
||||
a.Value = infoValue
|
||||
case lvl < ErrorLevel:
|
||||
a.Value = warnValue
|
||||
case lvl < FatalLevel:
|
||||
a.Value = errorValue
|
||||
case lvl >= FatalLevel:
|
||||
a.Value = fatalValue
|
||||
default:
|
||||
a.Value = infoValue
|
||||
}
|
||||
}
|
||||
|
||||
sync.RWMutex
|
||||
return a
|
||||
}
|
||||
|
||||
//TODO:!!!!
|
||||
type slogLogger struct {
|
||||
slog *slog.Logger
|
||||
leveler *slog.LevelVar
|
||||
opts Options
|
||||
}
|
||||
|
||||
func (s *slogLogger) Clone(opts ...options.Option) Logger {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
options := s.opts
|
||||
|
||||
for _, o := range opts {
|
||||
o(&options)
|
||||
}
|
||||
|
||||
l := &slogLogger{
|
||||
opts: options,
|
||||
}
|
||||
|
||||
if slog, ok := s.opts.Context.Value(loggerKey{}).(*slog.Logger); ok {
|
||||
l.slog = slog
|
||||
return nil
|
||||
}
|
||||
|
||||
l.leveler = new(slog.LevelVar)
|
||||
handleOpt := &slog.HandlerOptions{
|
||||
ReplaceAttr: renameAttr,
|
||||
Level: l.leveler,
|
||||
}
|
||||
l.leveler.Set(loggerToSlogLevel(l.opts.Level))
|
||||
handler := slog.NewJSONHandler(options.Out, handleOpt)
|
||||
l.slog = slog.New(handler).With(options.Fields...)
|
||||
|
||||
return l
|
||||
}
|
||||
|
||||
func (s *slogLogger) V(level Level) bool {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
return s.opts.Level.Enabled(level)
|
||||
}
|
||||
|
||||
func (s *slogLogger) Level(level Level) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
s.leveler.Set(loggerToSlogLevel(level))
|
||||
}
|
||||
|
||||
func (s *slogLogger) Options() Options {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
return s.opts
|
||||
}
|
||||
|
||||
func (s *slogLogger) Fields(fields ...interface{}) Logger {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
nl := &slogLogger{opts: s.opts}
|
||||
nl.leveler = new(slog.LevelVar)
|
||||
nl.leveler.Set(s.leveler.Level())
|
||||
|
||||
func (s *slogLogger) Trace(ctx context.Context, args ...interface{}) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
handleOpt := &slog.HandlerOptions{
|
||||
ReplaceAttr: renameAttr,
|
||||
Level: s.leveler,
|
||||
}
|
||||
|
||||
func (s *slogLogger) Tracef(ctx context.Context, msg string, args ...interface{}) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
handler := slog.NewJSONHandler(s.opts.Out, handleOpt)
|
||||
nl.slog = slog.New(handler).With(fields...)
|
||||
|
||||
func (s *slogLogger) Fatalf(ctx context.Context, msg string, args ...interface{}) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
return nl
|
||||
}
|
||||
|
||||
func (s *slogLogger) Init(opts ...options.Option) error {
|
||||
@@ -76,50 +121,33 @@ func (s *slogLogger) Init(opts ...options.Option) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
s.leveler = new(slog.LevelVar)
|
||||
handleOpt := &slog.HandlerOptions{
|
||||
ReplaceAttr: renameTime,
|
||||
Level: loggerToSlogLevel(s.opts.Level),
|
||||
ReplaceAttr: renameAttr,
|
||||
Level: s.leveler,
|
||||
}
|
||||
|
||||
attr := fieldsToAttr(s.fields)
|
||||
|
||||
handler := slog.NewJSONHandler(s.opts.Out, handleOpt).WithAttrs(attr)
|
||||
|
||||
s.slog = slog.New(handler)
|
||||
s.leveler.Set(loggerToSlogLevel(s.opts.Level))
|
||||
handler := slog.NewJSONHandler(s.opts.Out, handleOpt)
|
||||
s.slog = slog.New(handler).With(s.opts.Fields...)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *slogLogger) Log(ctx context.Context, lvl Level, args ...any) {
|
||||
slvl := loggerToSlogLevel(lvl)
|
||||
|
||||
s.RLock()
|
||||
attr := fieldsToAttr(s.fields)
|
||||
s.RUnlock()
|
||||
|
||||
msg := fmt.Sprint(args...)
|
||||
|
||||
if lvl == FatalLevel {
|
||||
log.Fatalln(msg, attr)
|
||||
if !s.V(lvl) {
|
||||
return
|
||||
}
|
||||
|
||||
s.slog.LogAttrs(ctx, slvl, msg, attr...)
|
||||
slvl := loggerToSlogLevel(lvl)
|
||||
msg := fmt.Sprint(args...)
|
||||
s.slog.Log(ctx, slvl, msg)
|
||||
}
|
||||
|
||||
func (s *slogLogger) Logf(ctx context.Context, lvl Level, format string, args ...any) {
|
||||
slvl := loggerToSlogLevel(lvl)
|
||||
|
||||
s.RLock()
|
||||
attr := fieldsToAttr(s.fields)
|
||||
s.RUnlock()
|
||||
|
||||
msg := fmt.Sprintf(format, args...)
|
||||
|
||||
if lvl == FatalLevel {
|
||||
log.Fatalln(msg, attr)
|
||||
if !s.V(lvl) {
|
||||
return
|
||||
}
|
||||
|
||||
s.slog.LogAttrs(ctx, slvl, msg, attr...)
|
||||
slvl := loggerToSlogLevel(lvl)
|
||||
s.slog.Log(ctx, slvl, format, args...)
|
||||
}
|
||||
|
||||
func (s *slogLogger) Info(ctx context.Context, args ...any) {
|
||||
@@ -142,6 +170,14 @@ func (s *slogLogger) Error(ctx context.Context, args ...any) {
|
||||
s.Log(ctx, ErrorLevel, args...)
|
||||
}
|
||||
|
||||
func (s *slogLogger) Trace(ctx context.Context, args ...interface{}) {
|
||||
s.Log(ctx, TraceLevel, args...)
|
||||
}
|
||||
|
||||
func (s *slogLogger) Tracef(ctx context.Context, msg string, args ...interface{}) {
|
||||
s.Logf(ctx, TraceLevel, msg, args...)
|
||||
}
|
||||
|
||||
func (s *slogLogger) Errorf(ctx context.Context, format string, args ...any) {
|
||||
s.Logf(ctx, ErrorLevel, format, args...)
|
||||
}
|
||||
@@ -150,6 +186,11 @@ func (s *slogLogger) Fatal(ctx context.Context, args ...any) {
|
||||
s.Log(ctx, FatalLevel, args...)
|
||||
}
|
||||
|
||||
func (s *slogLogger) Fatalf(ctx context.Context, msg string, args ...interface{}) {
|
||||
s.Logf(ctx, FatalLevel, msg, args...)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
func (s *slogLogger) Warn(ctx context.Context, args ...any) {
|
||||
s.Log(ctx, WarnLevel, args...)
|
||||
}
|
||||
@@ -159,86 +200,46 @@ func (s *slogLogger) Warnf(ctx context.Context, format string, args ...any) {
|
||||
}
|
||||
|
||||
func (s *slogLogger) String() string {
|
||||
return slogName
|
||||
return "slog"
|
||||
}
|
||||
|
||||
/*
|
||||
func (s *slogLogger) Fields(fields map[string]interface{}) Logger {
|
||||
nfields := make(map[string]interface{}, len(s.fields))
|
||||
|
||||
s.Lock()
|
||||
for k, v := range s.fields {
|
||||
nfields[k] = v
|
||||
}
|
||||
s.Unlock()
|
||||
|
||||
for k, v := range fields {
|
||||
nfields[k] = v
|
||||
}
|
||||
|
||||
keys := make([]string, 0, len(nfields))
|
||||
for k := range nfields {
|
||||
keys = append(keys, k)
|
||||
}
|
||||
sort.Strings(keys)
|
||||
|
||||
attr := make([]slog.Attr, 0, len(nfields))
|
||||
for _, k := range keys {
|
||||
attr = append(attr, slog.Any(k, fields[k]))
|
||||
}
|
||||
|
||||
handleOpt := &slog.HandlerOptions{
|
||||
ReplaceAttr: renameTime,
|
||||
Level: loggerToSlogLevel(s.opts.Level),
|
||||
}
|
||||
|
||||
handler := slog.NewJSONHandler(s.opts.Out, handleOpt).WithAttrs(attr)
|
||||
|
||||
zl := &slogLogger{
|
||||
slog: slog.New(handler),
|
||||
opts: s.opts,
|
||||
fields: make(map[string]interface{}),
|
||||
}
|
||||
|
||||
return zl
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
func NewSlogLogger(opts ...options.Option) (Logger, error) {
|
||||
func NewLogger(opts ...options.Option) Logger {
|
||||
l := &slogLogger{
|
||||
opts: NewOptions(opts...),
|
||||
}
|
||||
err := l.Init()
|
||||
return l, err
|
||||
}
|
||||
|
||||
func renameTime(groups []string, a slog.Attr) slog.Attr {
|
||||
if a.Key == slog.TimeKey {
|
||||
a.Key = "@timestamp"
|
||||
}
|
||||
|
||||
return a
|
||||
return l
|
||||
}
|
||||
|
||||
func loggerToSlogLevel(level Level) slog.Level {
|
||||
switch level {
|
||||
case TraceLevel, DebugLevel:
|
||||
case DebugLevel:
|
||||
return slog.LevelDebug
|
||||
case WarnLevel:
|
||||
return slog.LevelWarn
|
||||
case ErrorLevel, FatalLevel:
|
||||
case ErrorLevel:
|
||||
return slog.LevelError
|
||||
case TraceLevel:
|
||||
return slog.LevelDebug - 1
|
||||
case FatalLevel:
|
||||
return slog.LevelError + 1
|
||||
default:
|
||||
return slog.LevelInfo
|
||||
}
|
||||
}
|
||||
|
||||
func fieldsToAttr(m map[string]any) []slog.Attr {
|
||||
data := make([]slog.Attr, 0, len(m))
|
||||
for k, v := range m {
|
||||
data = append(data, slog.Any(k, v))
|
||||
func slogToLoggerLevel(level slog.Level) Level {
|
||||
switch level {
|
||||
case slog.LevelDebug:
|
||||
return DebugLevel
|
||||
case slog.LevelWarn:
|
||||
return WarnLevel
|
||||
case slog.LevelError:
|
||||
return ErrorLevel
|
||||
case slog.LevelDebug - 1:
|
||||
return TraceLevel
|
||||
case slog.LevelError + 1:
|
||||
return FatalLevel
|
||||
default:
|
||||
return InfoLevel
|
||||
}
|
||||
|
||||
return data
|
||||
}
|
||||
|
Reference in New Issue
Block a user