aboutsummaryrefslogtreecommitdiff
path: root/utils/logger/logger.go
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)
	}
}