80 lines
1.7 KiB
Go
80 lines
1.7 KiB
Go
package logger
|
|
|
|
import (
|
|
"io"
|
|
"io/ioutil"
|
|
"os"
|
|
"regexp"
|
|
"time"
|
|
|
|
"git.belvedersky.ru/common/logger/service"
|
|
"git.belvedersky.ru/common/logger/utils"
|
|
)
|
|
|
|
const (
|
|
ansi = "s,\x1b\\[[0-9;]*[a-zA-Z],,g"
|
|
)
|
|
|
|
var (
|
|
re = regexp.MustCompile(ansi)
|
|
)
|
|
|
|
type (
|
|
Logger struct {
|
|
cfg service.Config
|
|
file os.File
|
|
}
|
|
)
|
|
|
|
// Сервис логирования
|
|
func New(cfg service.Config, durationUpdate *time.Duration) *Logger {
|
|
logFile := utils.GetLogFile(cfg.Directory, cfg.LogFileName)
|
|
l := &Logger{
|
|
cfg: cfg,
|
|
file: *logFile,
|
|
}
|
|
if durationUpdate == nil {
|
|
t := time.Hour * 24
|
|
durationUpdate = &t
|
|
}
|
|
// Смена и очистка файла лога раз в сутки
|
|
go l.FileUpdate(false, durationUpdate)
|
|
return l
|
|
}
|
|
|
|
// Смена и очистка лог файла через указанное время
|
|
func (lg *Logger) FileUpdate(now bool, durationUpdate *time.Duration) (err error) {
|
|
for {
|
|
if !now {
|
|
time.Sleep(*durationUpdate)
|
|
}
|
|
b, err := ioutil.ReadAll(&lg.file)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
clean := re.ReplaceAllString(string(b), "")
|
|
if err = ioutil.WriteFile(lg.file.Name(), []byte(clean), 0644); err != nil {
|
|
return err
|
|
}
|
|
lg.file = *utils.GetLogFile(lg.cfg.Directory, lg.cfg.LogFileName)
|
|
if now {
|
|
break
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Создание нового сервиса логирования
|
|
func (lg *Logger) Create(name string) *service.LoggerService {
|
|
// Лог файл
|
|
l := utils.SetupLog(name)
|
|
// Дебаг в консоль
|
|
if lg.cfg.Development {
|
|
mw := io.MultiWriter(os.Stdout, &lg.file)
|
|
l.SetOutput(mw)
|
|
} else {
|
|
l.SetOutput(&lg.file)
|
|
}
|
|
return &service.LoggerService{Log: l, ServiceName: lg.cfg.System, Development: lg.cfg.Development, WebhookUrl: lg.cfg.Webhook}
|
|
}
|