Skip to content

Commit d1e90a4

Browse files
authored
feat(sdk): add stack trace in debug mode (#4138)
1 parent 98b78aa commit d1e90a4

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

.changeset/clean-pans-drop.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@module-federation/sdk': patch
3+
---
4+
5+
feat: add log stack trace in debug mode

packages/sdk/src/logger.ts

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,40 @@ type LoggerDelegate = Partial<Record<LogMethod, (...args: any[]) => void>> & {
99
};
1010

1111
const DEFAULT_DELEGATE: LoggerDelegate = console as unknown as LoggerDelegate;
12+
const LOGGER_STACK_SKIP_TOKENS = [
13+
'logger.ts',
14+
'logger.js',
15+
'captureStackTrace',
16+
'Logger.emit',
17+
'Logger.log',
18+
'Logger.info',
19+
'Logger.warn',
20+
'Logger.error',
21+
'Logger.debug',
22+
];
23+
24+
function captureStackTrace(): string | undefined {
25+
try {
26+
const stack = new Error().stack;
27+
if (!stack) {
28+
return undefined;
29+
}
30+
31+
const [, ...rawLines] = stack.split('\n');
32+
const filtered = rawLines.filter(
33+
(line) => !LOGGER_STACK_SKIP_TOKENS.some((token) => line.includes(token)),
34+
);
35+
36+
if (!filtered.length) {
37+
return undefined;
38+
}
39+
40+
const stackPreview = filtered.slice(0, 5).join('\n');
41+
return `Stack trace:\n${stackPreview}`;
42+
} catch {
43+
return undefined;
44+
}
45+
}
1246

1347
class Logger {
1448
prefix: string;
@@ -29,6 +63,10 @@ class Logger {
2963

3064
private emit(method: LogMethod, args: any[]) {
3165
const delegate = this.delegate;
66+
const debugMode = isDebugMode();
67+
const stackTrace = debugMode ? captureStackTrace() : undefined;
68+
const enrichedArgs = stackTrace ? [...args, stackTrace] : args;
69+
3270
const order: LogMethod[] = (() => {
3371
switch (method) {
3472
case 'log':
@@ -48,15 +86,15 @@ class Logger {
4886
for (const candidate of order) {
4987
const handler = delegate[candidate];
5088
if (typeof handler === 'function') {
51-
handler.call(delegate, this.prefix, ...args);
89+
handler.call(delegate, this.prefix, ...enrichedArgs);
5290
return;
5391
}
5492
}
5593

5694
for (const candidate of order) {
5795
const handler = DEFAULT_DELEGATE[candidate];
5896
if (typeof handler === 'function') {
59-
handler.call(DEFAULT_DELEGATE, this.prefix, ...args);
97+
handler.call(DEFAULT_DELEGATE, this.prefix, ...enrichedArgs);
6098
return;
6199
}
62100
}

0 commit comments

Comments
 (0)