about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/logger/__tests__/logger.test.ts20
-rw-r--r--src/logger/index.ts21
2 files changed, 37 insertions, 4 deletions
diff --git a/src/logger/__tests__/logger.test.ts b/src/logger/__tests__/logger.test.ts
index 46a5be610..f8b588778 100644
--- a/src/logger/__tests__/logger.test.ts
+++ b/src/logger/__tests__/logger.test.ts
@@ -222,6 +222,26 @@ describe('general functionality', () => {
     })
   })
 
+  test('sentryTransport serializes errors', () => {
+    const message = 'message'
+    const timestamp = Date.now()
+    const sentryTimestamp = timestamp / 1000
+
+    sentryTransport(
+      LogLevel.Debug,
+      message,
+      {error: new Error('foo')},
+      timestamp,
+    )
+    expect(Sentry.addBreadcrumb).toHaveBeenCalledWith({
+      message,
+      data: {error: 'Error: foo'},
+      type: 'default',
+      level: LogLevel.Debug,
+      timestamp: sentryTimestamp,
+    })
+  })
+
   test('add/remove transport', () => {
     const timestamp = Date.now()
     const logger = new Logger({enabled: true})
diff --git a/src/logger/index.ts b/src/logger/index.ts
index 3de2b9046..9f79a7812 100644
--- a/src/logger/index.ts
+++ b/src/logger/index.ts
@@ -90,6 +90,16 @@ const enabledLogLevels: {
   [LogLevel.Error]: [LogLevel.Error],
 }
 
+export function prepareMetadata(metadata: Metadata): Metadata {
+  return Object.keys(metadata).reduce((acc, key) => {
+    let value = metadata[key]
+    if (value instanceof Error) {
+      value = value.toString()
+    }
+    return {...acc, [key]: value}
+  }, {})
+}
+
 /**
  * Used in dev mode to nicely log to the console
  */
@@ -100,7 +110,8 @@ export const consoleTransport: Transport = (
   timestamp,
 ) => {
   const extra = Object.keys(metadata).length
-    ? ' ' + JSON.stringify(metadata, null, '  ')
+    ? // don't prepareMetadata here, in dev we want the stack trace
+      ' ' + JSON.stringify(metadata, null, '  ')
     : ''
   const log = {
     [LogLevel.Debug]: console.debug,
@@ -119,6 +130,8 @@ export const sentryTransport: Transport = (
   {type, tags, ...metadata},
   timestamp,
 ) => {
+  const meta = prepareMetadata(metadata)
+
   /**
    * If a string, report a breadcrumb
    */
@@ -135,7 +148,7 @@ export const sentryTransport: Transport = (
 
     Sentry.addBreadcrumb({
       message,
-      data: metadata,
+      data: meta,
       type: type || 'default',
       level: severity,
       timestamp: timestamp / 1000, // Sentry expects seconds
@@ -155,7 +168,7 @@ export const sentryTransport: Transport = (
       Sentry.captureMessage(message, {
         level: messageLevel,
         tags,
-        extra: metadata,
+        extra: meta,
       })
     }
   } else {
@@ -164,7 +177,7 @@ export const sentryTransport: Transport = (
      */
     Sentry.captureException(message, {
       tags,
-      extra: metadata,
+      extra: meta,
     })
   }
 }