blob: de2d69cc4a2212c9f50a873d7ce280958e38d756 (
plain)
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
|
package logger
import (
"fmt"
"os"
"strings"
"time"
"metachan/types"
)
const prefixWidth = 15
func getTimestamp() string {
return time.Now().Format(time.RFC3339)
}
func getLevelColor(level types.LogLevel) string {
switch level {
case types.Info:
return types.LevelColorInfo
case types.Warn:
return types.LevelColorWarn
case types.Error:
return types.LevelColorError
case types.Debug:
return types.LevelColorDebug
case types.Success:
return types.LevelColorSuccess
default:
return types.LevelColorInfo
}
}
func getMessageColor(level types.LogLevel) string {
switch level {
case types.Info:
return types.MessageColorInfo
case types.Warn:
return types.MessageColorWarn
case types.Error:
return types.MessageColorError
case types.Debug:
return types.MessageColorDebug
case types.Success:
return types.MessageColorSuccess
default:
return types.MessageColorInfo
}
}
func Log(message interface{}, options types.LogOptions) {
var builder strings.Builder
if options.Timestamp {
builder.WriteString(types.Gray)
builder.WriteString(getTimestamp())
builder.WriteString(types.Reset)
builder.WriteString(" ")
}
builder.WriteString(getLevelColor(options.Level))
builder.WriteString(" ")
if options.Prefix != "" {
totalWidth := len(options.Prefix)
padding := ""
if totalWidth < prefixWidth {
padding = strings.Repeat(" ", prefixWidth-totalWidth)
}
builder.WriteString(types.Cyan)
builder.WriteString("[")
builder.WriteString(options.Prefix)
builder.WriteString("]")
builder.WriteString(types.Reset)
builder.WriteString(padding)
builder.WriteString(" ")
}
builder.WriteString(getMessageColor(options.Level))
switch msg := message.(type) {
case error:
builder.WriteString(msg.Error())
case string:
builder.WriteString(msg)
default:
builder.WriteString(fmt.Sprintf("%v", msg))
}
builder.WriteString(types.Reset)
builder.WriteString("\n")
if options.Level == types.Error || options.Level == types.Warn {
os.Stderr.WriteString(builder.String())
} else {
os.Stdout.WriteString(builder.String())
}
if options.Fatal {
os.Exit(1)
}
}
|