mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Merge pull request #41909 from kzys/41794-sized-logger
Handle long log messages correctly on SizedLogger
This commit is contained in:
commit
c0c3e58bb2
5 changed files with 52 additions and 4 deletions
|
@ -400,6 +400,7 @@ func (l *logStream) Name() string {
|
||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BufSize returns the maximum bytes CloudWatch can handle.
|
||||||
func (l *logStream) BufSize() int {
|
func (l *logStream) BufSize() int {
|
||||||
return maximumBytesPerEvent
|
return maximumBytesPerEvent
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,7 +54,12 @@ func (c *Copier) copySrc(name string, src io.Reader) {
|
||||||
|
|
||||||
bufSize := defaultBufSize
|
bufSize := defaultBufSize
|
||||||
if sizedLogger, ok := c.dst.(SizedLogger); ok {
|
if sizedLogger, ok := c.dst.(SizedLogger); ok {
|
||||||
bufSize = sizedLogger.BufSize()
|
size := sizedLogger.BufSize()
|
||||||
|
// Loggers that wrap another loggers would have BufSize(), but cannot return the size
|
||||||
|
// when the wrapped loggers doesn't have BufSize().
|
||||||
|
if size > 0 {
|
||||||
|
bufSize = size
|
||||||
|
}
|
||||||
}
|
}
|
||||||
buf := make([]byte, bufSize)
|
buf := make([]byte, bufSize)
|
||||||
|
|
||||||
|
|
|
@ -223,10 +223,28 @@ func TestCopierSlow(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCopierWithSized(t *testing.T) {
|
func TestCopierWithSized(t *testing.T) {
|
||||||
|
t.Run("as is", func(t *testing.T) {
|
||||||
|
testCopierWithSized(t, func(l SizedLogger) SizedLogger {
|
||||||
|
return l
|
||||||
|
})
|
||||||
|
})
|
||||||
|
t.Run("With RingLogger", func(t *testing.T) {
|
||||||
|
testCopierWithSized(t, func(l SizedLogger) SizedLogger {
|
||||||
|
return newRingLogger(l, Info{}, defaultRingMaxSize)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func testCopierWithSized(t *testing.T, loggerFactory func(SizedLogger) SizedLogger) {
|
||||||
var jsonBuf bytes.Buffer
|
var jsonBuf bytes.Buffer
|
||||||
expectedMsgs := 2
|
expectedMsgs := 2
|
||||||
sizedLogger := &TestSizedLoggerJSON{Encoder: json.NewEncoder(&jsonBuf)}
|
sizedLogger := loggerFactory(&TestSizedLoggerJSON{Encoder: json.NewEncoder(&jsonBuf)})
|
||||||
logbuf := bytes.NewBufferString(strings.Repeat(".", sizedLogger.BufSize()*expectedMsgs))
|
|
||||||
|
size := sizedLogger.BufSize()
|
||||||
|
if size < 0 {
|
||||||
|
size = 100
|
||||||
|
}
|
||||||
|
logbuf := bytes.NewBufferString(strings.Repeat(".", size*expectedMsgs))
|
||||||
c := NewCopier(map[string]io.Reader{"stdout": logbuf}, sizedLogger)
|
c := NewCopier(map[string]io.Reader{"stdout": logbuf}, sizedLogger)
|
||||||
|
|
||||||
c.Run()
|
c.Run()
|
||||||
|
@ -234,6 +252,8 @@ func TestCopierWithSized(t *testing.T) {
|
||||||
c.Wait()
|
c.Wait()
|
||||||
c.Close()
|
c.Close()
|
||||||
|
|
||||||
|
sizedLogger.Close()
|
||||||
|
|
||||||
recvdMsgs := 0
|
recvdMsgs := 0
|
||||||
dec := json.NewDecoder(&jsonBuf)
|
dec := json.NewDecoder(&jsonBuf)
|
||||||
for {
|
for {
|
||||||
|
@ -253,7 +273,7 @@ func TestCopierWithSized(t *testing.T) {
|
||||||
recvdMsgs++
|
recvdMsgs++
|
||||||
}
|
}
|
||||||
if recvdMsgs != expectedMsgs {
|
if recvdMsgs != expectedMsgs {
|
||||||
t.Fatalf("expected to receive %d messages, actually received %d", expectedMsgs, recvdMsgs)
|
t.Fatalf("expected to receive %d messages, actually received %d %q", expectedMsgs, recvdMsgs, jsonBuf.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
11
daemon/logger/loggerutils/cache/local_cache.go
vendored
11
daemon/logger/loggerutils/cache/local_cache.go
vendored
|
@ -58,6 +58,17 @@ type loggerWithCache struct {
|
||||||
cache logger.Logger
|
cache logger.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ logger.SizedLogger = &loggerWithCache{}
|
||||||
|
|
||||||
|
// BufSize returns the buffer size of the underlying logger.
|
||||||
|
// Returns -1 if the logger doesn't match SizedLogger interface.
|
||||||
|
func (l *loggerWithCache) BufSize() int {
|
||||||
|
if sl, ok := l.l.(logger.SizedLogger); ok {
|
||||||
|
return sl.BufSize()
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
func (l *loggerWithCache) Log(msg *logger.Message) error {
|
func (l *loggerWithCache) Log(msg *logger.Message) error {
|
||||||
// copy the message as the original will be reset once the call to `Log` is complete
|
// copy the message as the original will be reset once the call to `Log` is complete
|
||||||
dup := logger.NewMessage()
|
dup := logger.NewMessage()
|
||||||
|
|
|
@ -21,6 +21,8 @@ type RingLogger struct {
|
||||||
closeFlag int32
|
closeFlag int32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ SizedLogger = &RingLogger{}
|
||||||
|
|
||||||
type ringWithReader struct {
|
type ringWithReader struct {
|
||||||
*RingLogger
|
*RingLogger
|
||||||
}
|
}
|
||||||
|
@ -57,6 +59,15 @@ func NewRingLogger(driver Logger, logInfo Info, maxSize int64) Logger {
|
||||||
return l
|
return l
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BufSize returns the buffer size of the underlying logger.
|
||||||
|
// Returns -1 if the logger doesn't match SizedLogger interface.
|
||||||
|
func (r *RingLogger) BufSize() int {
|
||||||
|
if sl, ok := r.l.(SizedLogger); ok {
|
||||||
|
return sl.BufSize()
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
// Log queues messages into the ring buffer
|
// Log queues messages into the ring buffer
|
||||||
func (r *RingLogger) Log(msg *Message) error {
|
func (r *RingLogger) Log(msg *Message) error {
|
||||||
if r.closed() {
|
if r.closed() {
|
||||||
|
|
Loading…
Reference in a new issue