This repository has been archived by the owner on Apr 5, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
level_write.go
103 lines (93 loc) · 2.22 KB
/
level_write.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
package logging
import (
"fmt"
"path/filepath"
"runtime"
"strings"
"time"
)
func (l *levelLogger) _log(lvl Level, callstackOffset int, args []any) {
l._logf(lvl, callstackOffset, "", args)
}
func (l *levelLogger) _logf(lvl Level, callstackOffset int, format string, args []any) {
if lvl < l.level {
return
}
totalCounter.Inc(1)
if lvl == LevelWarn {
warnCounter.Inc(1)
} else if lvl == LevelError {
errorCounter.Inc(1)
}
name := l.name
var srcFileName string
var srcFileLine int
if l.enableSrcLoc {
_, srcFileName, srcFileLine, _ = runtime.Caller(2 + callstackOffset)
srcFileName = filepath.Base(srcFileName)
width := (l.prefixWidth - len(srcFileName) - 5)
if width <= 0 {
width = 1
}
nameForm := fmt.Sprintf("%%-%ds %%s %%3d", width)
name = fmt.Sprintf(nameForm, name, srcFileName, srcFileLine)
} else {
nameForm := fmt.Sprintf("%%-%ds", l.prefixWidth)
name = fmt.Sprintf(nameForm, l.name)
}
levelColorBegin, levelColorEnd := "", ""
if lvl == LevelWarn {
levelColorBegin, levelColorEnd = yellow, reset
} else if lvl == LevelError {
levelColorBegin, levelColorEnd = red, reset
}
timestamp := time.Now()
levelWithPname := fmt.Sprintf("%-5s", logLevelNames[lvl])
for _, w := range l.underlying {
var fnew string
var forg = format
if format == "" {
forg = "%s"
}
if w.isTerm {
fnew = fmt.Sprintf("%v %s%s%s %s %s\n",
timestamp.Format("2006/01/02 15:04:05.000"),
levelColorBegin, levelWithPname, levelColorEnd,
name, forg)
} else {
fnew = fmt.Sprintf("%v %s %s %s\n",
timestamp.Format("2006/01/02 15:04:05.000"),
levelWithPname, name, forg)
}
line := ""
if format == "" {
toks := make([]string, len(args)+1)
for i, a := range args {
if s, ok := a.(string); ok {
toks[i] = s
} else {
toks[i] = fmt.Sprintf("%v", a)
}
}
line = fmt.Sprintf(fnew, strings.Join(toks, " "))
} else {
line = fmt.Sprintf(fnew, args...)
}
if w.isTerm {
w.Write([]byte(line))
} else {
w.Write([]byte(removeEscape(line)))
}
}
}
func removeEscape(str string) string {
for {
idx := strings.Index(str, "\033[")
if idx == -1 {
break
}
period := strings.Index(str[idx:], "m")
str = str[0:idx] + str[idx+period+1:]
}
return str
}