package slog import ( "fmt" "strings" "sync" "time" "wartank/pkg/components/kernel/slog/slog_file" "wartank/pkg/components/kernel/slog/slog_term" "wartank/pkg/components/safe_bool" "wartank/pkg/cons" "wartank/pkg/types" ) /* Попытка сделать логирование в файл и консоль */ const ( strSlog = "ISlog" LevelDebug = iota LevelInfo LevelWarn LevelError ) // Slog -- лог событий для записи type Slog struct { kern types.IKernel buf strings.Builder block sync.RWMutex lf *slog_file.SlogFile lt *slog_term.SlogTerm isWork *safe_bool.БезопБул level int // Уровень логирования } // NewSlog -- возвращает объект логирования func NewSlog(kern types.IKernel) (*Slog, error) { if kern == nil { return nil, fmt.Errorf("NewSlog(): IKernel is nil") } сам := &Slog{ kern: kern, buf: strings.Builder{}, lt: slog_term.NewSlogTerm(), isWork: safe_bool.НовБезопБул(), level: LevelDebug, } lf, err := slog_file.NewSlogFile(kern, "test") if err != nil { return nil, fmt.Errorf("NewSlog(): in create SlogFile, err=\n\t%w", err) } сам.lf = lf go сам.close() сам.isWork.Уст() сам.kern.Wg().Add(strSlog) сам.Infof("NewSlog()\n") return сам, nil } // Debugf -- выводит в лог отладочную инфу func (сам *Slog) Debugf(str string, lstVal ...interface{}) { сам.block.Lock() defer сам.block.Unlock() if !сам.isWork.Получ() { return } сам.printf("DEBUG", str, lstVal...) } // Infof -- выводит в лог дежурную инфу func (сам *Slog) Infof(str string, lstVal ...interface{}) { сам.block.Lock() defer сам.block.Unlock() if !сам.isWork.Получ() { return } сам.printf("INFO", str, lstVal...) } // Warnf -- выводит в лог предупредительную инфу func (сам *Slog) Warnf(str string, lstVal ...interface{}) { сам.block.Lock() defer сам.block.Unlock() if !сам.isWork.Получ() { return } сам.printf("WARN", str, lstVal...) } // Errorf -- выводит в лог инфу об ошибках func (сам *Slog) Errorf(str string, lstVal ...interface{}) { сам.block.Lock() defer сам.block.Unlock() if !сам.isWork.Получ() { return } сам.printf("ERROR", str, lstVal...) } // Внутренний вызов без блокировки func (сам *Slog) printf(pref, str string, lstVal ...interface{}) { style := "" switch pref { case "DEBUG": // Режим отладки style = "\033[2;37;40m" // case "PRINT": // Режим печати // style = "\033[0;34;40m" case "INFO": // Режим информирования style = "\033[0;37;40m" case "WARN": // Режим предупреждения style = "\033[1;31;40m" case "ERROR": // Режим ошибки style = "\033[1;37;41m" } strTime := time.Now().Local().Format("2006-01-02 15:04:05.000\t") сам.buf.WriteString(strTime + "\t") сам.buf.WriteString(pref + "\t") сам.buf.WriteString(cons.СамИмя + "\n\t") сам.buf.WriteString(fmt.Sprintf(str, lstVal...)) сам.lf.Write(сам.buf.String()) сам.lt.Write(style + сам.buf.String() + "\033[00m") сам.buf.Reset() } // Ожидает закрытия приложения func (сам *Slog) close() { <-сам.kern.Done() сам.block.Lock() if !сам.isWork.Получ() { return } сам.isWork.Сброс() сам.kern.Wg().Done(strSlog) сам.block.Unlock() }