in log/rollwriter/async_roll_writer.go [96:133]
func (w *AsyncRollWriter) batchWriteLog() {
buffer := bytes.NewBuffer(make([]byte, 0, w.opts.WriteLogSize*2))
ticker := time.NewTicker(time.Millisecond * time.Duration(w.opts.WriteLogInterval))
defer ticker.Stop()
for {
select {
case <-ticker.C:
if buffer.Len() > 0 {
_, _ = w.logger.Write(buffer.Bytes())
buffer.Reset()
}
case data := <-w.logQueue:
buffer.Write(data)
if buffer.Len() >= w.opts.WriteLogSize {
_, _ = w.logger.Write(buffer.Bytes())
buffer.Reset()
}
case <-w.sync:
var err error
if buffer.Len() > 0 {
_, e := w.logger.Write(buffer.Bytes())
err = multierror.Append(err, e).ErrorOrNil()
buffer.Reset()
}
size := len(w.logQueue)
for i := 0; i < size; i++ {
v := <-w.logQueue
_, e := w.logger.Write(v)
err = multierror.Append(err, e).ErrorOrNil()
}
w.syncErr <- err
case <-w.close:
w.closeErr <- w.logger.Close()
return
}
}
}