chore(accesslog): reduce buffering for stdout

This commit is contained in:
yusing 2025-04-26 08:29:55 +08:00
parent 8f20bd3840
commit 6a8f6fb4b5

View file

@ -4,6 +4,7 @@ import (
"bufio" "bufio"
"io" "io"
"net/http" "net/http"
"os"
"sync" "sync"
"time" "time"
@ -53,6 +54,7 @@ type (
) )
const ( const (
StdoutbufSize = 64
MinBufferSize = 4 * kilobyte MinBufferSize = 4 * kilobyte
MaxBufferSize = 1 * megabyte MaxBufferSize = 1 * megabyte
) )
@ -79,6 +81,22 @@ func NewMockAccessLogger(parent task.Parent, cfg *RequestLoggerConfig) *AccessLo
return NewAccessLoggerWithIO(parent, NewMockFile(), cfg) return NewAccessLoggerWithIO(parent, NewMockFile(), cfg)
} }
func unwrap[Writer any](w io.Writer) []Writer {
var result []Writer
if unwrapped, ok := w.(MultiWriterInterface); ok {
for _, w := range unwrapped.Unwrap() {
if unwrapped, ok := w.(Writer); ok {
result = append(result, unwrapped)
}
}
return result
}
if unwrapped, ok := w.(Writer); ok {
return []Writer{unwrapped}
}
return nil
}
func NewAccessLoggerWithIO(parent task.Parent, writer WriterWithName, anyCfg AnyConfig) *AccessLogger { func NewAccessLoggerWithIO(parent task.Parent, writer WriterWithName, anyCfg AnyConfig) *AccessLogger {
cfg := anyCfg.ToConfig() cfg := anyCfg.ToConfig()
if cfg.BufferSize == 0 { if cfg.BufferSize == 0 {
@ -90,6 +108,10 @@ func NewAccessLoggerWithIO(parent task.Parent, writer WriterWithName, anyCfg Any
if cfg.BufferSize > MaxBufferSize { if cfg.BufferSize > MaxBufferSize {
cfg.BufferSize = MaxBufferSize cfg.BufferSize = MaxBufferSize
} }
if _, ok := writer.(*os.File); ok {
cfg.BufferSize = StdoutbufSize
}
l := &AccessLogger{ l := &AccessLogger{
task: parent.Subtask("accesslog."+writer.Name(), true), task: parent.Subtask("accesslog."+writer.Name(), true),
cfg: cfg, cfg: cfg,
@ -99,23 +121,8 @@ func NewAccessLoggerWithIO(parent task.Parent, writer WriterWithName, anyCfg Any
logger: logging.With().Str("file", writer.Name()).Logger(), logger: logging.With().Str("file", writer.Name()).Logger(),
} }
if unwrapped, ok := writer.(MultiWriterInterface); ok { l.supportRotate = unwrap[supportRotate](writer)
for _, w := range unwrapped.Unwrap() { l.closer = unwrap[io.Closer](writer)
if sr, ok := w.(supportRotate); ok {
l.supportRotate = append(l.supportRotate, sr)
}
if closer, ok := w.(io.Closer); ok {
l.closer = append(l.closer, closer)
}
}
} else {
if sr, ok := writer.(supportRotate); ok {
l.supportRotate = append(l.supportRotate, sr)
}
if closer, ok := writer.(io.Closer); ok {
l.closer = append(l.closer, closer)
}
}
if cfg.req != nil { if cfg.req != nil {
fmt := CommonFormatter{cfg: &cfg.req.Fields} fmt := CommonFormatter{cfg: &cfg.req.Fields}