/
logger.go
130 lines (109 loc) · 2.45 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
package oss
import (
"fmt"
"log"
"strings"
)
// A LogPrinter is a interface for the SDK to log messages to.
type LogPrinter interface {
Print(...any)
}
// A LogPrinterFunc is a convenience type to wrap it so the LogPrinter interface can be used.
type LogPrinterFunc func(...any)
// Print calls the wrapped function with the arguments provided
func (f LogPrinterFunc) Print(v ...any) {
f(v...)
}
// Define the level of the output log
const (
LogOff = iota
LogError
LogWarn
LogInfo
LogDebug
)
var logLevelTag = []string{"", "ERROR ", "WARNING ", "INFO ", "DEBUG "}
// Logger interface to handle logging
type Logger interface {
Debugf(format string, v ...any)
Infof(format string, v ...any)
Warnf(format string, v ...any)
Errorf(format string, v ...any)
Level() int
}
type nopLogger struct {
}
func (*nopLogger) Debugf(_ string, _ ...any) {}
func (*nopLogger) Infof(_ string, _ ...any) {}
func (*nopLogger) Warnf(_ string, _ ...any) {}
func (*nopLogger) Errorf(_ string, _ ...any) {}
func (*nopLogger) Level() int { return LogOff }
// NewLogger returns a Logger
func NewLogger(level int, printer LogPrinter) Logger {
if level <= LogOff {
return &nopLogger{}
}
if printer == nil {
printer = LogPrinterFunc(func(v ...any) {
log.Print(v...)
})
}
return &standardLogger{
level: level,
printer: printer,
}
}
type standardLogger struct {
level int
printer LogPrinter
}
func (l *standardLogger) printf(level int, format string, v ...any) {
if l.printer == nil {
return
}
l.printer.Print(logLevelTag[level], fmt.Sprintf(format, v...))
}
func (l *standardLogger) Debugf(format string, v ...any) {
if l.level < LogDebug {
return
}
l.printf(LogDebug, format, v...)
}
func (l *standardLogger) Infof(format string, v ...any) {
if l.level < LogInfo {
return
}
l.printf(LogInfo, format, v...)
}
func (l *standardLogger) Warnf(format string, v ...any) {
if l.level < LogWarn {
return
}
l.printf(LogWarn, format, v...)
}
func (l *standardLogger) Errorf(format string, v ...any) {
if l.level < LogError {
return
}
l.printf(LogError, format, v...)
}
func (l *standardLogger) Level() int {
return l.level
}
func ToLogLevel(s string) int {
s = strings.ToLower(s)
switch s {
case "error", "err":
return LogError
case "warning", "warn":
return LogWarn
case "info":
return LogInfo
case "debug", "dbg":
return LogDebug
default:
return LogOff
}
}
var _ Logger = (*nopLogger)(nil)
var _ Logger = (*standardLogger)(nil)