OnlineLibrary

Форк
0
120 строк · 2.2 Кб
1
package log
2

3
import (
4
	"fmt"
5
	"io"
6
	"path/filepath"
7
	"runtime"
8
	"strings"
9
	"sync"
10
	"time"
11
)
12

13
type Level int
14

15
const (
16
	Error Level = iota
17
	Info
18
	Warning
19
	Debug
20
)
21

22
func (l Level) String() string {
23
	switch l {
24
	case Error:
25
		return "ERROR"
26
	case Info:
27
		return "INFO"
28
	case Warning:
29
		return "WARNING"
30
	case Debug:
31
		return "DEBUG"
32
	default:
33
		return "UNKNOWN"
34
	}
35
}
36

37
func StringToLevel(str string) (Level, error) {
38
	switch str {
39
	case Error.String():
40
		return Error, nil
41
	case Info.String():
42
		return Info, nil
43
	case Warning.String():
44
		return Warning, nil
45
	case Debug.String():
46
		return Debug, nil
47
	default:
48
		return 0, fmt.Errorf("%v is not a supported log level", str)
49
	}
50
}
51

52
type Logger struct {
53
	mu     sync.Mutex
54
	level  Level
55
	indent string
56
	out    io.Writer
57
}
58

59
func New(out io.Writer, level Level, indent string) *Logger {
60
	return &Logger{out: out, level: level, indent: indent}
61
}
62

63
func (l *Logger) log(calldepth int, level Level, format string, args ...any) {
64
	l.mu.Lock()
65
	defer l.mu.Unlock()
66
	if l.level < level || l.out == nil {
67
		return
68
	}
69
	hour, min, sec := time.Now().Clock()
70
	clock := fmt.Sprintf("%02d:%02d:%02d", hour, min, sec)
71
	_, file, line, ok := runtime.Caller(calldepth)
72
	if !ok {
73
		file = "???"
74
		line = 0
75
	}
76
	msg := fmt.Sprintf(strings.ReplaceAll(format, "\n", "\n"+l.indent), args...)
77
	fmt.Fprintf(l.out, "%v - %v:%v (%v):\r\n%v%v\r\n", level, filepath.Base(file), line, clock, l.indent, msg)
78
}
79

80
func (l *Logger) Error(format string, args ...any) {
81
	l.log(2, Error, format, args...)
82
}
83

84
func (l *Logger) Info(format string, args ...any) {
85
	l.log(2, Info, format, args...)
86
}
87

88
func (l *Logger) Warning(format string, args ...any) {
89
	l.log(2, Warning, format, args...)
90
}
91

92
func (l *Logger) Debug(format string, args ...any) {
93
	l.log(2, Debug, format, args...)
94
}
95

96
func (l *Logger) SetOutput(out io.Writer) {
97
	l.mu.Lock()
98
	defer l.mu.Unlock()
99
	l.out = out
100
}
101

102
func (l *Logger) SetLevel(level Level) error {
103
	l.mu.Lock()
104
	defer l.mu.Unlock()
105
	if level < Error || level > Debug {
106
		return fmt.Errorf("unsupported log level: %v", level)
107
	}
108
	l.level = level
109
	return nil
110
}
111

112
func (l *Logger) Level() Level {
113
	l.mu.Lock()
114
	defer l.mu.Unlock()
115
	return l.level
116
}
117

118
func (l *Logger) SupportedLevels() []Level {
119
	return []Level{Error, Info, Warning, Debug}
120
}
121

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.