OnlineLibrary
120 строк · 2.2 Кб
1package log2
3import (4"fmt"5"io"6"path/filepath"7"runtime"8"strings"9"sync"10"time"11)
12
13type Level int14
15const (16Error Level = iota17Info
18Warning
19Debug
20)
21
22func (l Level) String() string {23switch l {24case Error:25return "ERROR"26case Info:27return "INFO"28case Warning:29return "WARNING"30case Debug:31return "DEBUG"32default:33return "UNKNOWN"34}35}
36
37func StringToLevel(str string) (Level, error) {38switch str {39case Error.String():40return Error, nil41case Info.String():42return Info, nil43case Warning.String():44return Warning, nil45case Debug.String():46return Debug, nil47default:48return 0, fmt.Errorf("%v is not a supported log level", str)49}50}
51
52type Logger struct {53mu sync.Mutex54level Level
55indent string56out io.Writer57}
58
59func New(out io.Writer, level Level, indent string) *Logger {60return &Logger{out: out, level: level, indent: indent}61}
62
63func (l *Logger) log(calldepth int, level Level, format string, args ...any) {64l.mu.Lock()65defer l.mu.Unlock()66if l.level < level || l.out == nil {67return68}69hour, min, sec := time.Now().Clock()70clock := fmt.Sprintf("%02d:%02d:%02d", hour, min, sec)71_, file, line, ok := runtime.Caller(calldepth)72if !ok {73file = "???"74line = 075}76msg := fmt.Sprintf(strings.ReplaceAll(format, "\n", "\n"+l.indent), args...)77fmt.Fprintf(l.out, "%v - %v:%v (%v):\r\n%v%v\r\n", level, filepath.Base(file), line, clock, l.indent, msg)78}
79
80func (l *Logger) Error(format string, args ...any) {81l.log(2, Error, format, args...)82}
83
84func (l *Logger) Info(format string, args ...any) {85l.log(2, Info, format, args...)86}
87
88func (l *Logger) Warning(format string, args ...any) {89l.log(2, Warning, format, args...)90}
91
92func (l *Logger) Debug(format string, args ...any) {93l.log(2, Debug, format, args...)94}
95
96func (l *Logger) SetOutput(out io.Writer) {97l.mu.Lock()98defer l.mu.Unlock()99l.out = out100}
101
102func (l *Logger) SetLevel(level Level) error {103l.mu.Lock()104defer l.mu.Unlock()105if level < Error || level > Debug {106return fmt.Errorf("unsupported log level: %v", level)107}108l.level = level109return nil110}
111
112func (l *Logger) Level() Level {113l.mu.Lock()114defer l.mu.Unlock()115return l.level116}
117
118func (l *Logger) SupportedLevels() []Level {119return []Level{Error, Info, Warning, Debug}120}
121