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
}