logger/logger.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}
}