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..39293dcc55 100644 --- a/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts +++ b/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts @@ -94,27 +94,20 @@ describe('WinstonLogger', () => { ); }); - it('gracefully handles fields that are not castable to a string', () => { - const mockTransport = new Transport({ - log: jest.fn(), - logv: jest.fn(), - }); + 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: Object.create(null), + field: { foo: { bar: { baz: 'qux' } } }, }); - expect(mockTransport.log).toHaveBeenCalledWith( - expect.objectContaining({ - [MESSAGE]: expect.stringContaining( - '[field value not castable to string]', - ), - }), - expect.any(Function), + expect(log.mock.calls[0][0][MESSAGE]).toContain( + `={"foo":{"bar":{"baz":"qux"}}}`, ); }); }); 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]'; }