func NewFileLog()

in pkg/accesslog/file.go [40:88]


func NewFileLog(root, template string, interval time.Duration, log *logger.Logger) (Log, error) {
	var file *os.File
	var err error
	if file, err = createFile(root, template); err != nil {
		return nil, err
	}
	f := &fileLog{
		validRequests: make(chan proto.Message, 100),
		file:          file,
		closer:        run.NewCloser(1),
	}
	go func() {
		defer f.closer.Done()
		defer close(f.validRequests)

		ticker := time.NewTicker(interval)

		for {
			select {
			case <-f.closer.CloseNotify():
				if f.file != nil {
					f.file.Close()
				}
				ticker.Stop()
				return
			case <-ticker.C:
				if f.file != nil {
					f.file.Close()
				}
				if f.file, err = createFile(root, template); err != nil {
					log.Error().Err(err).Msg("failed to open file for writing")
					continue
				}
			case req := <-f.validRequests:
				if f.file != nil {
					data, err := protojson.Marshal(req)
					if err != nil {
						log.Error().Err(err).Msg("failed to marshal request")
						continue
					}
					if _, err := f.file.WriteString(string(data) + "\n"); err != nil {
						log.Error().Err(err).Msg("failed to write request to file")
					}
				}
			}
		}
	}()
	return f, nil
}