Skip to content

Commit 8046e14

Browse files
authored
fix(core): Run beforeSendLog after we process log (#16019)
We should run `beforeSendLog` after we do processing to logs to add relevant attributes. This ensures that users can control or mutate things like `sentry.message.template` if they so wish.
1 parent 56aac53 commit 8046e14

File tree

2 files changed

+27
-23
lines changed

2 files changed

+27
-23
lines changed

packages/core/src/logs/exports.ts

+26-23
Original file line numberDiff line numberDiff line change
@@ -79,57 +79,60 @@ export function _INTERNAL_captureLog(
7979
return;
8080
}
8181

82-
client.emit('beforeCaptureLog', beforeLog);
83-
84-
const log = beforeSendLog ? beforeSendLog(beforeLog) : beforeLog;
85-
if (!log) {
86-
client.recordDroppedEvent('before_send', 'log_item', 1);
87-
DEBUG_BUILD && logger.warn('beforeSendLog returned null, log will not be captured.');
88-
return;
89-
}
90-
9182
const [, traceContext] = _getTraceInfoFromScope(client, scope);
9283

93-
const { level, message, attributes, severityNumber } = log;
94-
95-
const logAttributes = {
96-
...attributes,
84+
const processedLogAttributes = {
85+
...beforeLog.attributes,
9786
};
9887

9988
if (release) {
100-
logAttributes['sentry.release'] = release;
89+
processedLogAttributes['sentry.release'] = release;
10190
}
10291

10392
if (environment) {
104-
logAttributes['sentry.environment'] = environment;
93+
processedLogAttributes['sentry.environment'] = environment;
10594
}
10695

10796
const { sdk } = client.getSdkMetadata() ?? {};
10897
if (sdk) {
109-
logAttributes['sentry.sdk.name'] = sdk.name;
110-
logAttributes['sentry.sdk.version'] = sdk.version;
98+
processedLogAttributes['sentry.sdk.name'] = sdk.name;
99+
processedLogAttributes['sentry.sdk.version'] = sdk.version;
111100
}
112101

113-
if (isParameterizedString(message)) {
114-
const { __sentry_template_string__, __sentry_template_values__ = [] } = message;
115-
logAttributes['sentry.message.template'] = __sentry_template_string__;
102+
const beforeLogMessage = beforeLog.message;
103+
if (isParameterizedString(beforeLogMessage)) {
104+
const { __sentry_template_string__, __sentry_template_values__ = [] } = beforeLogMessage;
105+
processedLogAttributes['sentry.message.template'] = __sentry_template_string__;
116106
__sentry_template_values__.forEach((param, index) => {
117-
logAttributes[`sentry.message.parameter.${index}`] = param;
107+
processedLogAttributes[`sentry.message.parameter.${index}`] = param;
118108
});
119109
}
120110

121111
const span = _getSpanForScope(scope);
122112
if (span) {
123113
// Add the parent span ID to the log attributes for trace context
124-
logAttributes['sentry.trace.parent_span_id'] = span.spanContext().spanId;
114+
processedLogAttributes['sentry.trace.parent_span_id'] = span.spanContext().spanId;
125115
}
126116

117+
const processedLog = { ...beforeLog, attributes: processedLogAttributes };
118+
119+
client.emit('beforeCaptureLog', processedLog);
120+
121+
const log = beforeSendLog ? beforeSendLog(processedLog) : processedLog;
122+
if (!log) {
123+
client.recordDroppedEvent('before_send', 'log_item', 1);
124+
DEBUG_BUILD && logger.warn('beforeSendLog returned null, log will not be captured.');
125+
return;
126+
}
127+
128+
const { level, message, attributes = {}, severityNumber } = log;
129+
127130
const serializedLog: SerializedOtelLog = {
128131
severityText: level,
129132
body: {
130133
stringValue: message,
131134
},
132-
attributes: Object.entries(logAttributes).map(([key, value]) => logAttributeToSerializedLogAttribute(key, value)),
135+
attributes: Object.entries(attributes).map(([key, value]) => logAttributeToSerializedLogAttribute(key, value)),
133136
timeUnixNano: `${new Date().getTime().toString()}000000`,
134137
traceId: traceContext?.trace_id,
135138
severityNumber: severityNumber ?? SEVERITY_TEXT_TO_SEVERITY_NUMBER[level],

packages/core/test/lib/logs/exports.test.ts

+1
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ describe('_INTERNAL_captureLog', () => {
343343
const log: Log = {
344344
level: 'info',
345345
message: 'test message',
346+
attributes: {},
346347
};
347348

348349
_INTERNAL_captureLog(log, client, undefined);

0 commit comments

Comments
 (0)