From ecb9babcfc4393146d52ebdeeaf8f70407c9c546 Mon Sep 17 00:00:00 2001 From: Paul Schultz Date: Thu, 20 Feb 2025 16:11:03 -0600 Subject: [PATCH 1/2] fix: explicitly stringify extra fields passed to the logger service Signed-off-by: Paul Schultz --- .changeset/itchy-schools-camp.md | 5 ++++ .../rootLogger/WinstonLogger.test.ts | 24 ------------------- .../entrypoints/rootLogger/WinstonLogger.ts | 2 +- 3 files changed, 6 insertions(+), 25 deletions(-) create mode 100644 .changeset/itchy-schools-camp.md diff --git a/.changeset/itchy-schools-camp.md b/.changeset/itchy-schools-camp.md new file mode 100644 index 0000000000..31b4231a69 --- /dev/null +++ b/.changeset/itchy-schools-camp.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': patch +--- + +Explicitly stringify extra logger fields with `JSON.stringify` to prevent `[object Object]` errors. diff --git a/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts b/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts index ec46f22759..0f9e079943 100644 --- a/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts +++ b/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts @@ -93,28 +93,4 @@ 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 9f7532e66b..545c9377b2 100644 --- a/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.ts +++ b/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.ts @@ -151,7 +151,7 @@ export class WinstonLogger implements RootLoggerService { let stringValue = ''; try { - stringValue = `${value}`; + stringValue = JSON.stringify(value); } catch (e) { stringValue = '[field value not castable to string]'; } From b5e84429c0657578c2d397a429e1eb9a10669ecd Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 21 Feb 2025 13:51:29 +0100 Subject: [PATCH 2/2] backend-defaults: add test for nested log meta fields Signed-off-by: Patrik Oldsberg --- .../rootLogger/WinstonLogger.test.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts b/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts index 0f9e079943..39293dcc55 100644 --- a/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts +++ b/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts @@ -93,4 +93,21 @@ describe('WinstonLogger', () => { expect.any(Function), ); }); + + it('gracefully handles fields that contain deeper object structures', () => { + const log = jest.fn(); + const mockTransport = new Transport({ log }); + + const logger = WinstonLogger.create({ + transports: [mockTransport], + }); + + logger.error('something went wrong', { + field: { foo: { bar: { baz: 'qux' } } }, + }); + + expect(log.mock.calls[0][0][MESSAGE]).toContain( + `={"foo":{"bar":{"baz":"qux"}}}`, + ); + }); });