Skip to content

Commit 12ffcdd

Browse files
authored
fix: don't use error message as log message for object-only patterns STONK-487 (#4)
1 parent 00c87dd commit 12ffcdd

2 files changed

Lines changed: 14 additions & 23 deletions

File tree

src/index.ts

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,7 @@ export const structuredLogger = (opts: StructuredLoggerOptions = {}) => ({
108108
return
109109
}
110110

111-
const { messageTemplate, structured, error } = extractStructuredData(
112-
args,
113-
getErrorKey(this),
114-
)
111+
const { messageTemplate, structured, error } = extractStructuredData(args)
115112
const structuredWithBindings = { ...this.bindings(), ...structured }
116113
const formattedMessage = reformatMessageWithRemainingArgs(
117114
formatMessage(messageTemplate, structuredWithBindings),
@@ -149,7 +146,6 @@ const formatMessage = (
149146

150147
const extractStructuredData = (
151148
args: Parameters<LogFn>,
152-
errorKey: string,
153149
): {
154150
messageTemplate: string
155151
structured: Record<string, unknown>
@@ -185,13 +181,10 @@ const extractStructuredData = (
185181
if (typeof args[0] === 'object' && args[0] !== null) {
186182
const obj = args.shift() as Error | Record<string, unknown>
187183
if (obj instanceof Error) {
188-
return { messageTemplate: obj.message || '', structured: {}, error: obj }
184+
return { messageTemplate: '', structured: {}, error: obj }
189185
}
190186
const structured = obj
191-
const errValue = structured[errorKey]
192-
const messageTemplate =
193-
errValue instanceof Error ? errValue.message || '' : ''
194-
return { messageTemplate, structured }
187+
return { messageTemplate: '', structured }
195188
}
196189

197190
// this should never happen

test/index.spec.ts

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -427,13 +427,13 @@ describe('structured logger', () => {
427427
})
428428

429429
describe('object without message', () => {
430-
it('uses error message when only an Error is passed', () => {
430+
it('does not use error message as log message when only an Error is passed', () => {
431431
const error = new Error('Something went wrong')
432432
logger.error(error)
433433

434434
expect(capturedLogs).toHaveLength(1)
435-
expect(capturedLogs[0].msg).toBe('Something went wrong')
436-
expect(capturedLogs[0].msg_tpl).toBe('Something went wrong')
435+
expect(capturedLogs[0].msg).toBe('')
436+
expect(capturedLogs[0].msg_tpl).toBe('')
437437
expect(capturedLogs[0].err).toEqual({
438438
message: 'Something went wrong',
439439
type: 'Error',
@@ -442,13 +442,13 @@ describe('structured logger', () => {
442442
expect(capturedLogs[0].data).toBeUndefined()
443443
})
444444

445-
it('uses err.message when object with error is passed', () => {
445+
it('does not use err.message as log message when object with error is passed', () => {
446446
const error = new Error('Internal server error')
447447
logger.error({ err: error })
448448

449449
expect(capturedLogs).toHaveLength(1)
450-
expect(capturedLogs[0].msg).toBe('Internal server error')
451-
expect(capturedLogs[0].msg_tpl).toBe('Internal server error')
450+
expect(capturedLogs[0].msg).toBe('')
451+
expect(capturedLogs[0].msg_tpl).toBe('')
452452
expect(capturedLogs[0].err).toEqual({
453453
message: 'Internal server error',
454454
type: 'Error',
@@ -462,7 +462,7 @@ describe('structured logger', () => {
462462
logger.error({ err: error, ctx: 'ExceptionFilter', status_code: 500 })
463463

464464
expect(capturedLogs).toHaveLength(1)
465-
expect(capturedLogs[0].msg).toBe('Unhandled exception')
465+
expect(capturedLogs[0].msg).toBe('')
466466
expect(capturedLogs[0].err).toEqual({
467467
message: 'Unhandled exception',
468468
type: 'Error',
@@ -500,7 +500,7 @@ describe('structured logger', () => {
500500
customLogger.error({ pinoError: error, ctx: 'Test' })
501501

502502
expect(capturedLogs).toHaveLength(1)
503-
expect(capturedLogs[0].msg).toBe('Custom key error')
503+
expect(capturedLogs[0].msg).toBe('')
504504
expect(capturedLogs[0].pinoError).toEqual({
505505
message: 'Custom key error',
506506
type: 'Error',
@@ -533,7 +533,7 @@ describe('structured logger', () => {
533533
logger.error({ err: exception, ctx: 'ExceptionsHandler' })
534534

535535
expect(capturedLogs).toHaveLength(1)
536-
expect(capturedLogs[0].msg).toBe('Internal Server Error')
536+
expect(capturedLogs[0].msg).toBe('')
537537
expect(capturedLogs[0].err).toEqual(
538538
expect.objectContaining({
539539
message: 'Internal Server Error',
@@ -573,9 +573,7 @@ describe('structured logger', () => {
573573
logger.error({ err: exception, ctx: 'DatabaseModule' })
574574

575575
expect(capturedLogs).toHaveLength(1)
576-
expect(capturedLogs[0].msg).toBe(
577-
'{"statusCode":503,"message":"Database connection failed","error":"Service Unavailable"}',
578-
)
576+
expect(capturedLogs[0].msg).toBe('')
579577
expect(capturedLogs[0].err).toEqual(
580578
expect.objectContaining({
581579
message:
@@ -590,7 +588,7 @@ describe('structured logger', () => {
590588
logger.child({ request_id: 'abc-123' }).error({ err: new Error('fail') })
591589

592590
expect(capturedLogs).toHaveLength(1)
593-
expect(capturedLogs[0].msg).toBe('fail')
591+
expect(capturedLogs[0].msg).toBe('')
594592
expect(capturedLogs[0].err).toEqual({
595593
message: 'fail',
596594
type: 'Error',

0 commit comments

Comments
 (0)