diff --git a/packages/core/src/logs/exports.ts b/packages/core/src/logs/exports.ts index 8b5f0c76bc17..4864f3b32b8e 100644 --- a/packages/core/src/logs/exports.ts +++ b/packages/core/src/logs/exports.ts @@ -79,57 +79,60 @@ export function _INTERNAL_captureLog( return; } - client.emit('beforeCaptureLog', beforeLog); - - const log = beforeSendLog ? beforeSendLog(beforeLog) : beforeLog; - if (!log) { - client.recordDroppedEvent('before_send', 'log_item', 1); - DEBUG_BUILD && logger.warn('beforeSendLog returned null, log will not be captured.'); - return; - } - const [, traceContext] = _getTraceInfoFromScope(client, scope); - const { level, message, attributes, severityNumber } = log; - - const logAttributes = { - ...attributes, + const processedLogAttributes = { + ...beforeLog.attributes, }; if (release) { - logAttributes['sentry.release'] = release; + processedLogAttributes['sentry.release'] = release; } if (environment) { - logAttributes['sentry.environment'] = environment; + processedLogAttributes['sentry.environment'] = environment; } const { sdk } = client.getSdkMetadata() ?? {}; if (sdk) { - logAttributes['sentry.sdk.name'] = sdk.name; - logAttributes['sentry.sdk.version'] = sdk.version; + processedLogAttributes['sentry.sdk.name'] = sdk.name; + processedLogAttributes['sentry.sdk.version'] = sdk.version; } - if (isParameterizedString(message)) { - const { __sentry_template_string__, __sentry_template_values__ = [] } = message; - logAttributes['sentry.message.template'] = __sentry_template_string__; + const beforeLogMessage = beforeLog.message; + if (isParameterizedString(beforeLogMessage)) { + const { __sentry_template_string__, __sentry_template_values__ = [] } = beforeLogMessage; + processedLogAttributes['sentry.message.template'] = __sentry_template_string__; __sentry_template_values__.forEach((param, index) => { - logAttributes[`sentry.message.parameter.${index}`] = param; + processedLogAttributes[`sentry.message.parameter.${index}`] = param; }); } const span = _getSpanForScope(scope); if (span) { // Add the parent span ID to the log attributes for trace context - logAttributes['sentry.trace.parent_span_id'] = span.spanContext().spanId; + processedLogAttributes['sentry.trace.parent_span_id'] = span.spanContext().spanId; } + const processedLog = { ...beforeLog, attributes: processedLogAttributes }; + + client.emit('beforeCaptureLog', processedLog); + + const log = beforeSendLog ? beforeSendLog(processedLog) : processedLog; + if (!log) { + client.recordDroppedEvent('before_send', 'log_item', 1); + DEBUG_BUILD && logger.warn('beforeSendLog returned null, log will not be captured.'); + return; + } + + const { level, message, attributes = {}, severityNumber } = log; + const serializedLog: SerializedOtelLog = { severityText: level, body: { stringValue: message, }, - attributes: Object.entries(logAttributes).map(([key, value]) => logAttributeToSerializedLogAttribute(key, value)), + attributes: Object.entries(attributes).map(([key, value]) => logAttributeToSerializedLogAttribute(key, value)), timeUnixNano: `${new Date().getTime().toString()}000000`, traceId: traceContext?.trace_id, severityNumber: severityNumber ?? SEVERITY_TEXT_TO_SEVERITY_NUMBER[level], diff --git a/packages/core/test/lib/logs/exports.test.ts b/packages/core/test/lib/logs/exports.test.ts index c672373df947..e71df274ec06 100644 --- a/packages/core/test/lib/logs/exports.test.ts +++ b/packages/core/test/lib/logs/exports.test.ts @@ -343,6 +343,7 @@ describe('_INTERNAL_captureLog', () => { const log: Log = { level: 'info', message: 'test message', + attributes: {}, }; _INTERNAL_captureLog(log, client, undefined);