Skip to content

Commit f3aa997

Browse files
authored
feat(core): Add logger to core and allow scope to be passed log methods (#17698)
Supercedes #16874 This PR makes two changes 1. It adds `logger` as an export to `@sentry/core`, and then refactors the `browser`, `cloudflare` and `vercel-edge` packages to just re-export `@sentry/core`'s logger. This change makes it easy to use logging in an isomorphic way, and reduces duplication between our various packages. We couldn't change the export from `node-core` because it has a different type signature than the standard logger. 2. It expands the logger exports to accept an optional scope argument. This allows for users to provide their own custom clients to the methods, which helps with standalone client cases. ```js import * as Sentry from "@sentry/browser"; const client = createMySentryClient(); const scope = new Sentry.Scope(); scope.setClient(client); Sentry.logger.info("Hello World!", {}, { scope }); ```
1 parent 162143f commit f3aa997

File tree

17 files changed

+294
-502
lines changed

17 files changed

+294
-502
lines changed

packages/browser/src/index.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
import { feedbackAsyncIntegration } from './feedbackAsync';
22
import { feedbackSyncIntegration } from './feedbackSync';
3-
import * as logger from './log';
43

54
export * from './exports';
65

7-
export { logger };
8-
96
export { reportingObserverIntegration } from './integrations/reportingobserver';
107
export { httpClientIntegration } from './integrations/httpclient';
118
export { contextLinesIntegration } from './integrations/contextlines';
@@ -63,6 +60,7 @@ export {
6360
zodErrorsIntegration,
6461
thirdPartyErrorFilterIntegration,
6562
featureFlagsIntegration,
63+
logger,
6664
} from '@sentry/core';
6765
export type { Span, FeatureFlagsIntegration } from '@sentry/core';
6866
export { makeBrowserOfflineTransport } from './transports/offline';

packages/browser/test/client.test.ts

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
*/
44

55
import * as sentryCore from '@sentry/core';
6+
import { Scope } from '@sentry/core';
67
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
78
import { applyDefaultOptions, BrowserClient } from '../src/client';
89
import { WINDOW } from '../src/helpers';
@@ -30,10 +31,12 @@ describe('BrowserClient', () => {
3031
sendClientReports: true,
3132
}),
3233
);
34+
const scope = new Scope();
35+
scope.setClient(client);
3336

3437
// Add some logs
35-
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 1' }, client);
36-
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 2' }, client);
38+
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 1' }, scope);
39+
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 2' }, scope);
3740

3841
// Simulate visibility change to hidden
3942
if (WINDOW.document) {
@@ -58,9 +61,12 @@ describe('BrowserClient', () => {
5861
it('flushes logs when page visibility changes to hidden', () => {
5962
const flushOutcomesSpy = vi.spyOn(client as any, '_flushOutcomes');
6063

64+
const scope = new Scope();
65+
scope.setClient(client);
66+
6167
// Add some logs
62-
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 1' }, client);
63-
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 2' }, client);
68+
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 1' }, scope);
69+
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 2' }, scope);
6470

6571
// Simulate visibility change to hidden
6672
if (WINDOW.document) {
@@ -73,9 +79,12 @@ describe('BrowserClient', () => {
7379
});
7480

7581
it('flushes logs on flush event', () => {
82+
const scope = new Scope();
83+
scope.setClient(client);
84+
7685
// Add some logs
77-
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 1' }, client);
78-
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 2' }, client);
86+
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 1' }, scope);
87+
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 2' }, scope);
7988

8089
// Trigger flush event
8190
client.emit('flush');
@@ -84,8 +93,11 @@ describe('BrowserClient', () => {
8493
});
8594

8695
it('flushes logs after idle timeout', () => {
96+
const scope = new Scope();
97+
scope.setClient(client);
98+
8799
// Add a log which will trigger afterCaptureLog event
88-
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log' }, client);
100+
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log' }, scope);
89101

90102
// Fast forward the idle timeout
91103
vi.advanceTimersByTime(DEFAULT_FLUSH_INTERVAL);
@@ -94,14 +106,17 @@ describe('BrowserClient', () => {
94106
});
95107

96108
it('resets idle timeout when new logs are captured', () => {
109+
const scope = new Scope();
110+
scope.setClient(client);
111+
97112
// Add initial log
98-
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 1' }, client);
113+
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 1' }, scope);
99114

100115
// Fast forward part of the idle timeout
101116
vi.advanceTimersByTime(DEFAULT_FLUSH_INTERVAL / 2);
102117

103118
// Add another log which should reset the timeout
104-
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 2' }, client);
119+
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 2' }, scope);
105120

106121
// Fast forward the remaining time
107122
vi.advanceTimersByTime(DEFAULT_FLUSH_INTERVAL / 2);

packages/browser/test/log.test.ts

Lines changed: 0 additions & 150 deletions
This file was deleted.

packages/cloudflare/src/index.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,9 @@ export {
9696
consoleLoggingIntegration,
9797
createConsolaReporter,
9898
featureFlagsIntegration,
99+
logger,
99100
} from '@sentry/core';
100101

101-
export * as logger from './logs/exports';
102-
103102
export { withSentry } from './handler';
104103
export { instrumentDurableObjectWithSentry } from './durableobject';
105104
export { sentryPagesPlugin } from './pages-plugin';

0 commit comments

Comments
 (0)