From 133f8d3c29ec030e19ab92ab8fa4ce575a104b33 Mon Sep 17 00:00:00 2001 From: Benoit Tassin Date: Fri, 21 Jun 2024 13:29:00 +0200 Subject: [PATCH 1/2] Improve the LoggerService.trace method to print the stack trace --- src/lib/logger.service.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/lib/logger.service.ts b/src/lib/logger.service.ts index 6fbb9cf..d1d0d07 100644 --- a/src/lib/logger.service.ts +++ b/src/lib/logger.service.ts @@ -42,7 +42,12 @@ export class NGXLogger { } public trace(message?: any | (() => any), ...additional: any[]): void { - this._log(NgxLoggerLevel.TRACE, message, additional); + // We manually set the stack trace using a dummy Error. + // This is done instead of using console.trace in _log method to ensure the stack trace is kept at the highest level possible. + // If the dummy error has no stack, we default to printing only the message and additional parameters. + const _traceDummyError = new Error(); + _traceDummyError.name = message; + this._log(NgxLoggerLevel.TRACE, _traceDummyError.stack || message, additional); } public debug(message?: any | (() => any), ...additional: any[]): void { From 2fc2930d258662aa07385e651fddc570aa2a0d77 Mon Sep 17 00:00:00 2001 From: Benoit Tassin Date: Fri, 21 Jun 2024 13:49:33 +0200 Subject: [PATCH 2/2] update the unit tests for the LoggerService with new trace method --- src/lib/logger.service.spec.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/lib/logger.service.spec.ts b/src/lib/logger.service.spec.ts index 6b3a532..afcc2be 100644 --- a/src/lib/logger.service.spec.ts +++ b/src/lib/logger.service.spec.ts @@ -36,10 +36,17 @@ describe('NGXLogger', () => { [NGXLogger], (logger: NGXLogger) => { const logSpy = spyOn(logger, '_log'); - - logger.trace('message'); - - expect(logSpy).toHaveBeenCalledWith(NgxLoggerLevel.TRACE, 'message', []); + const messageString = 'message'; + + logger.trace(messageString); + const _testStackError = new Error(); + _testStackError.name = messageString; + + expect(logSpy).toHaveBeenCalled(); + expect(logSpy.calls.argsFor(0)[0]).toBe(NgxLoggerLevel.TRACE); + // We can't test the exact stack trace so we only make sure the message is included + expect(logSpy.calls.argsFor(0)[1]).toContain(messageString); + expect(logSpy.calls.argsFor(0)[2]).toEqual([]); } )); });