-
Notifications
You must be signed in to change notification settings - Fork 0
/
log_slog.go
118 lines (104 loc) · 2.68 KB
/
log_slog.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
* Copyright 2023 Enoch <lanxenet@gmail.com>. All rights reserved.
* Use of this source code is governed by a MIT style
* license that can be found in the LICENSE file.
*/
package log
import (
"context"
"log/slog"
"os"
)
var _ Logger = (*slogLogger)(nil)
// slogLogger zap.Logger 的实现
type slogLogger struct {
log *slog.Logger
}
func newSlogLogger(h slog.Handler) *slogLogger {
logger := slog.New(h)
return &slogLogger{
log: logger,
}
}
const (
levelDebug = slog.LevelDebug
levelInfo = slog.LevelInfo
levelWarn = slog.LevelWarn
levelError = slog.LevelError
levelPanic = slog.Level(10)
levelFatal = slog.Level(12)
)
func customLevel(groups []string, a slog.Attr) slog.Attr {
// Customize the name of the level key and the output string, including
// custom level values.
if a.Key == slog.LevelKey {
// Handle custom level values.
level := a.Value.Any().(slog.Level)
// This could also look up the name from a map or other structure, but
// this demonstrates using a switch statement to rename levels. For
// maximum performance, the string values should be constants, but this
// example uses the raw strings for readability.
switch {
case level < levelDebug:
a.Value = slog.StringValue("TRACE")
case level < levelInfo:
a.Value = slog.StringValue("INFO")
case level < levelWarn:
a.Value = slog.StringValue("WARN")
case level < levelError:
a.Value = slog.StringValue("ERROR")
case level < levelPanic:
a.Value = slog.StringValue("ERROR")
case level < levelFatal:
a.Value = slog.StringValue("FATAL")
default:
a.Value = slog.StringValue("INFO")
}
}
return a
}
func (l *slogLogger) Log(ctx context.Context, level Level, msg string, keyValues ...interface{}) {
switch level {
case DebugLevel:
l.log.Log(ctx, levelDebug, msg, keyValues...)
case InfoLevel:
l.log.Log(ctx, levelInfo, msg, keyValues...)
case WarnLevel:
l.log.Log(ctx, levelWarn, msg, keyValues...)
case ErrorLevel:
l.log.Log(ctx, levelError, msg, keyValues...)
case PanicLevel:
l.log.Log(ctx, levelPanic, msg, keyValues...)
case FatalLevel:
l.log.Log(ctx, levelFatal, msg, keyValues...)
}
}
func (l *slogLogger) Close() error {
return nil
}
func initSlogLogger(lvl Level) Logger {
logger := newSlogLogger(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
AddSource: false,
ReplaceAttr: customLevel,
Level: toSlogLevel(lvl),
}))
return logger
}
func toSlogLevel(l Level) slog.Level {
switch l {
case DebugLevel:
return levelDebug
case InfoLevel:
return levelInfo
case WarnLevel:
return levelWarn
case ErrorLevel:
return levelError
case PanicLevel:
return levelPanic
case FatalLevel:
return levelFatal
default:
return levelInfo
}
}