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} }