-
Notifications
You must be signed in to change notification settings - Fork 128
/
logger.go
134 lines (112 loc) 路 3.41 KB
/
logger.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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// Package ylog provides a slog.Logger instance for logging.
// ylog also provides a default slog.Logger, the default logger is build from environment.
//
// ylog allows to call log api directly, like:
//
// ylog.Debug("test", "name", "yomo")
// ylog.Info("test", "name", "yomo")
// ylog.Warn("test", "name", "yomo")
// ylog.Error("test", "name", "yomo")
package ylog
import (
"io"
"log"
"os"
"strconv"
"strings"
"github.com/caarlos0/env/v6"
"golang.org/x/exp/slog"
)
var defaultLogger = Default()
// SetDefault set global logger.
func SetDefault(logger *slog.Logger) { defaultLogger = logger }
// Debug logs a message at debug level.
func Debug(msg string, keyvals ...interface{}) {
defaultLogger.Debug(msg, keyvals...)
}
// Info logs a message at info level.
func Info(msg string, keyvals ...interface{}) {
defaultLogger.Info(msg, keyvals...)
}
// Warn logs a message at warn level.
func Warn(msg string, keyvals ...interface{}) {
defaultLogger.Warn(msg, keyvals...)
}
// Error logs a message at error level.
func Error(msg string, err error, keyvals ...interface{}) {
defaultLogger.Error(msg, err, keyvals...)
}
// Config is the config of slog, the config is from environment.
type Config struct {
// Verbose indicates if logger log code line, use false for production.
Verbose bool `env:"YOMO_LOG_VERBOSE" envDefault:"false"`
// the log level, It can be one of `debug`, `info`, `warn`, `error`
Level string `env:"YOMO_LOG_LEVEL" envDefault:"info"`
// log output file path, It's stdout if not set.
Output string `env:"YOMO_LOG_OUTPUT"`
// error log output file path, It's stderr if not set.
ErrorOutput string `env:"YOMO_LOG_ERROR_OUTPUT"`
// log format, support text and json.
Format string `env:"YOMO_LOG_FORMAT" envDefault:"text"`
// DisableTime disable time key, It's a pravited field, Just for testing.
DisableTime bool
}
// DebugFrameSize is use for log dataFrame,
// It means that only logs the first DebugFrameSize bytes if the data is large than DebugFrameSize bytes.
//
// DebugFrameSize is default to 16,
// if env `YOMO_DEBUG_FRAME_SIZE` is setted and It's an int number, Set the env value to DebugFrameSize.
var DebugFrameSize = 16
func init() {
if e := os.Getenv("YOMO_DEBUG_FRAME_SIZE"); e != "" {
if val, err := strconv.Atoi(e); err == nil {
DebugFrameSize = val
}
}
}
// Default returns a slog.Logger according to enviroment.
func Default() *slog.Logger {
var conf Config
if err := env.Parse(&conf); err != nil {
log.Fatalf("%+v\n", err)
}
return NewFromConfig(conf)
}
// NewFromConfig returns a slog.Logger according to conf.
func NewFromConfig(conf Config) *slog.Logger {
return slog.New(NewHandlerFromConfig(conf))
}
func parseToWriter(path string, defaultWriter io.Writer) (io.Writer, error) {
switch strings.ToLower(path) {
case "stdout":
return os.Stdout, nil
case "stderr":
return os.Stderr, nil
default:
if path != "" {
return os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
}
return defaultWriter, nil
}
}
func mustParseToWriter(path string, defaultWriter io.Writer) io.Writer {
w, err := parseToWriter(path, defaultWriter)
if err != nil {
panic(err)
}
return w
}
func parseToSlogLevel(stringLevel string) slog.Level {
var level = slog.LevelDebug
switch strings.ToLower(stringLevel) {
case "debug":
level = slog.LevelDebug
case "info":
level = slog.LevelInfo
case "warn":
level = slog.LevelWarn
case "error":
level = slog.LevelError
}
return level
}