diff --git a/src/components/FeedCard.tsx b/src/components/FeedCard.tsx index f7446bc81d..1c1895418f 100644 --- a/src/components/FeedCard.tsx +++ b/src/components/FeedCard.tsx @@ -271,7 +271,7 @@ function SaveButtonInner({ } Toast.show(_(msg`Feeds updated!`)) } catch (err: any) { - logger.error(err, {context: `FeedCard: failed to update feeds`, pin}) + logger.error(err, {message: `FeedCard: failed to update feeds`, pin}) Toast.show(_(msg`Failed to update feeds`), 'xmark') } }, diff --git a/src/components/dialogs/PostInteractionSettingsDialog.tsx b/src/components/dialogs/PostInteractionSettingsDialog.tsx index fdf075ca42..63b640d9fe 100644 --- a/src/components/dialogs/PostInteractionSettingsDialog.tsx +++ b/src/components/dialogs/PostInteractionSettingsDialog.tsx @@ -209,7 +209,7 @@ export function PostInteractionSettingsDialogControlledInner( props.control.close() } catch (e: any) { logger.error(`Failed to save post interaction settings`, { - context: 'PostInteractionSettingsDialogControlledInner', + source: 'PostInteractionSettingsDialogControlledInner', safeMessage: e.message, }) Toast.show( diff --git a/src/logger/transports/bitdrift.ts b/src/logger/transports/bitdrift.ts index d9e3481565..6e335f29c5 100644 --- a/src/logger/transports/bitdrift.ts +++ b/src/logger/transports/bitdrift.ts @@ -22,5 +22,9 @@ export const bitdriftTransport: Transport = ( metadata, ) => { const log = logFunctions[level] - log(`(${context}) ${message}`, prepareMetadata(metadata)) + log(message.toString(), { + // match Sentry payload + context, + ...prepareMetadata(metadata), + }) } diff --git a/src/logger/transports/sentry.ts b/src/logger/transports/sentry.ts index c8ba400ae5..890918d676 100644 --- a/src/logger/transports/sentry.ts +++ b/src/logger/transports/sentry.ts @@ -10,7 +10,17 @@ export const sentryTransport: Transport = ( {type, tags, ...metadata}, timestamp, ) => { - const meta = prepareMetadata(metadata) + const meta = { + // match Bitdrift payload + context, + ...prepareMetadata(metadata), + } + let _tags = tags || {} + _tags = { + // use `category` to match breadcrumbs + category: context, + ...tags, + } /** * If a string, report a breadcrumb @@ -46,9 +56,9 @@ export const sentryTransport: Transport = ( */ if (level === 'error' || level === 'warn' || level === 'log') { // Defer non-critical messages so they're sent in a batch - queueMessageForSentry(`(${context}) message`, { + queueMessageForSentry(message, { level: severity, - tags, + tags: _tags, extra: meta, }) } @@ -57,7 +67,7 @@ export const sentryTransport: Transport = ( * It's otherwise an Error and should be reported with captureException */ Sentry.captureException(message, { - tags, + tags: _tags, extra: meta, }) } diff --git a/src/logger/types.ts b/src/logger/types.ts index 6e076aefa5..517893d290 100644 --- a/src/logger/types.ts +++ b/src/logger/types.ts @@ -32,6 +32,11 @@ export type Transport = ( * `captureException` parameter, `CaptureContext`. */ export type Metadata = { + /** + * Reserved for appending `LogContext` to logging payloads + */ + context?: undefined + /** * Applied as Sentry breadcrumb types. Defaults to `default`. * diff --git a/src/screens/Deactivated.tsx b/src/screens/Deactivated.tsx index 602012f086..c989673649 100644 --- a/src/screens/Deactivated.tsx +++ b/src/screens/Deactivated.tsx @@ -96,7 +96,7 @@ export function Deactivated() { } logger.error(e, { - context: 'Failed to activate account', + message: 'Failed to activate account', }) } finally { setPending(false) diff --git a/src/screens/ModerationInteractionSettings/index.tsx b/src/screens/ModerationInteractionSettings/index.tsx index 99b29d950e..ee72ff9dae 100644 --- a/src/screens/ModerationInteractionSettings/index.tsx +++ b/src/screens/ModerationInteractionSettings/index.tsx @@ -102,7 +102,7 @@ function Inner({preferences}: {preferences: UsePreferencesQueryResponse}) { Toast.show(_(msg`Settings saved`)) } catch (e: any) { logger.error(`Failed to save post interaction settings`, { - context: 'ModerationInteractionSettingsScreen', + source: 'ModerationInteractionSettingsScreen', safeMessage: e.message, }) setError(_(msg`Failed to save settings. Please try again.`)) diff --git a/src/screens/Settings/components/DeactivateAccountDialog.tsx b/src/screens/Settings/components/DeactivateAccountDialog.tsx index f5059861c8..78c685770a 100644 --- a/src/screens/Settings/components/DeactivateAccountDialog.tsx +++ b/src/screens/Settings/components/DeactivateAccountDialog.tsx @@ -61,7 +61,7 @@ function DeactivateAccountDialogInner({ } logger.error(e, { - context: 'Failed to deactivate account', + message: 'Failed to deactivate account', }) } finally { setPending(false) diff --git a/src/state/messages/convo/agent.ts b/src/state/messages/convo/agent.ts index a3baf2acca..73e75f58d2 100644 --- a/src/state/messages/convo/agent.ts +++ b/src/state/messages/convo/agent.ts @@ -469,7 +469,7 @@ export class Convo { this.dispatch({event: ConvoDispatchEvent.Ready}) } } catch (e: any) { - logger.error(e, {context: 'Convo: setup failed'}) + logger.error(e, {message: 'Convo: setup failed'}) this.dispatch({ event: ConvoDispatchEvent.Error, @@ -574,7 +574,7 @@ export class Convo { this.sender = sender || this.sender this.recipients = recipients || this.recipients } catch (e: any) { - logger.error(e, {context: `Convo: failed to refresh convo`}) + logger.error(e, {message: `Convo: failed to refresh convo`}) } } @@ -834,7 +834,7 @@ export class Convo { // continue queue processing await this.processPendingMessages() } catch (e: any) { - logger.error(e, {context: `Convo: failed to send message`}) + logger.error(e, {message: `Convo: failed to send message`}) this.handleSendMessageFailure(e) this.isProcessingPendingMessages = false } @@ -880,7 +880,7 @@ export class Convo { } else { this.pendingMessageFailure = 'unrecoverable' logger.error(e, { - context: `Convo handleSendMessageFailure received unknown error`, + message: `Convo handleSendMessageFailure received unknown error`, }) } @@ -935,7 +935,7 @@ export class Convo { {}, ) } catch (e: any) { - logger.error(e, {context: `Convo: failed to batch retry messages`}) + logger.error(e, {message: `Convo: failed to batch retry messages`}) this.handleSendMessageFailure(e) } } @@ -957,7 +957,7 @@ export class Convo { ) }) } catch (e: any) { - logger.error(e, {context: `Convo: failed to delete message`}) + logger.error(e, {message: `Convo: failed to delete message`}) this.deletedMessages.delete(messageId) this.commit() throw e diff --git a/src/state/messages/events/agent.ts b/src/state/messages/events/agent.ts index b9f50ed6cf..9890eee3fd 100644 --- a/src/state/messages/events/agent.ts +++ b/src/state/messages/events/agent.ts @@ -255,7 +255,7 @@ export class MessagesEventBus { this.dispatch({event: MessagesEventBusDispatchEvent.Ready}) } catch (e: any) { logger.error(e, { - context: `${LOGGER_CONTEXT}: init failed`, + message: `${LOGGER_CONTEXT}: init failed`, }) this.dispatch({ @@ -368,12 +368,12 @@ export class MessagesEventBus { this.emitter.emit('event', {type: 'logs', logs: batch}) } catch (e: any) { logger.error(e, { - context: `${LOGGER_CONTEXT}: process latest events`, + message: `${LOGGER_CONTEXT}: process latest events`, }) } } } catch (e: any) { - logger.error(e, {context: `${LOGGER_CONTEXT}: poll events failed`}) + logger.error(e, {message: `${LOGGER_CONTEXT}: poll events failed`}) this.dispatch({ event: MessagesEventBusDispatchEvent.Error, diff --git a/src/state/session/agent.ts b/src/state/session/agent.ts index ba0c14c1a1..531e285ab1 100644 --- a/src/state/session/agent.ts +++ b/src/state/session/agent.ts @@ -166,7 +166,7 @@ export async function createAgentAndCreateAccount( }) } catch (e: any) { logger.error(e, { - context: `session: createAgentAndCreateAccount failed to save personal details and feeds`, + message: `session: createAgentAndCreateAccount failed to save personal details and feeds`, }) } } else { @@ -177,7 +177,7 @@ export async function createAgentAndCreateAccount( // snooze first prompt after signup, defer to next prompt snoozeEmailConfirmationPrompt() } catch (e: any) { - logger.error(e, {context: `session: failed snoozeEmailConfirmationPrompt`}) + logger.error(e, {message: `session: failed snoozeEmailConfirmationPrompt`}) } return agent.prepare(gates, moderation, onSessionChange)