From f5336f07b2148c602ba74acdd964ca4f70722577 Mon Sep 17 00:00:00 2001 From: Harrison Hogg Date: Tue, 26 Nov 2024 11:54:29 +0000 Subject: [PATCH 1/2] Fixed WinstongLogger logging fields which are not castable to a string Signed-off-by: Harrison Hogg --- .../rootLogger/WinstonLogger.test.ts | 24 +++++++++++++++++++ .../entrypoints/rootLogger/WinstonLogger.ts | 15 ++++++++---- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts b/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts index 0f9e079943..ec46f22759 100644 --- a/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts +++ b/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts @@ -93,4 +93,28 @@ describe('WinstonLogger', () => { expect.any(Function), ); }); + + it('gracefully handles fields that are not castable to a string', () => { + const mockTransport = new Transport({ + log: jest.fn(), + logv: jest.fn(), + }); + + const logger = WinstonLogger.create({ + transports: [mockTransport], + }); + + logger.error('something went wrong', { + field: Object.create(null), + }); + + expect(mockTransport.log).toHaveBeenCalledWith( + expect.objectContaining({ + [MESSAGE]: expect.stringContaining( + '[field value not castable to string]', + ), + }), + expect.any(Function), + ); + }); }); diff --git a/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.ts b/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.ts index 38d05f6511..9f7532e66b 100644 --- a/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.ts +++ b/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.ts @@ -147,10 +147,17 @@ export class WinstonLogger implements RootLoggerService { const prefixColor = colorizer.colorize('prefix', prefix); const extraFields = Object.entries(fields) - .map( - ([key, value]) => - `${colorizer.colorize('field', `${key}`)}=${value}`, - ) + .map(([key, value]) => { + let stringValue = ''; + + try { + stringValue = `${value}`; + } catch (e) { + stringValue = '[field value not castable to string]'; + } + + return `${colorizer.colorize('field', `${key}`)}=${stringValue}`; + }) .join(' '); return `${timestampColor} ${prefixColor} ${level} ${message} ${extraFields}`; From cf627c6c5470e50d8bad1de16586518079c287dd Mon Sep 17 00:00:00 2001 From: Harrison Hogg Date: Tue, 26 Nov 2024 12:06:40 +0000 Subject: [PATCH 2/2] Added changeset Signed-off-by: Harrison Hogg --- .changeset/ten-keys-nail.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/ten-keys-nail.md diff --git a/.changeset/ten-keys-nail.md b/.changeset/ten-keys-nail.md new file mode 100644 index 0000000000..0662e4a346 --- /dev/null +++ b/.changeset/ten-keys-nail.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': patch +--- + +Fixed an issue in the WinstonLogger where Errors thrown and given to logger.error with field values that could not be cast to a string would throw a TypeError