diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index 35397f7659..2f342f6ff7 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -1255,7 +1255,10 @@ class Logger extends Utility implements LoggerInterface { return; } - const buffer = this.#buffer.get(traceId) || []; + const buffer = this.#buffer.get(traceId); + if (buffer === undefined) { + return; + } for (const item of buffer) { const consoleMethod = @@ -1266,6 +1269,16 @@ class Logger extends Utility implements LoggerInterface { ).toLowerCase() as keyof Omit); this.console[consoleMethod](item.value); } + if (buffer.hasEvictedLog) { + this.printLog( + LogLevelThreshold.WARN, + this.createAndPopulateLogItem( + LogLevelThreshold.WARN, + 'Some logs are not displayed because they were evicted from the buffer. Increase buffer size to store more logs in the buffer', + [] + ) + ); + } this.#buffer.delete(traceId); } diff --git a/packages/logger/src/logBuffer.ts b/packages/logger/src/logBuffer.ts index 164f3e3735..e17512515b 100644 --- a/packages/logger/src/logBuffer.ts +++ b/packages/logger/src/logBuffer.ts @@ -17,6 +17,7 @@ export class SizedItem { export class SizedSet extends Set> { public currentBytesSize = 0; + public hasEvictedLog = false; add(item: SizedItem): this { this.currentBytesSize += item.byteSize; @@ -89,6 +90,7 @@ export class CircularMap extends Map> { ) => { while (buffer.currentBytesSize + item.byteSize >= this.#maxBytesSize) { buffer.shift(); + buffer.hasEvictedLog = true; } }; } diff --git a/packages/logger/tests/unit/logBuffer.test.ts b/packages/logger/tests/unit/logBuffer.test.ts index 4cbc5caaea..9ba2923bc3 100644 --- a/packages/logger/tests/unit/logBuffer.test.ts +++ b/packages/logger/tests/unit/logBuffer.test.ts @@ -107,4 +107,34 @@ describe('flushBuffer', () => { expect(console.debug).toHaveBeenCalledTimes(0); expect(console.warn).toHaveBeenCalledTimes(1); }); + + it('outputs a warning when buffered logs have been evicted', () => { + // Prepare + const logger = new TestLogger({ logLevel: 'ERROR' }); + logger.enableBuffering(); + logger.setbufferLevelThreshold(LogLevelThreshold.INFO); + + // Act + const longMessage = 'blah'.repeat(10); + + let i = 0; + while (i < 4) { + logger.info( + `${i} This is a really long log message intended to exceed the buffer ${longMessage}` + ); + i++; + } + + // Act + logger.flushBufferWrapper(); + + // Assess + expect(console.warn).toHaveLogged( + expect.objectContaining({ + level: 'WARN', + message: + 'Some logs are not displayed because they were evicted from the buffer. Increase buffer size to store more logs in the buffer', + }) + ); + }); });