|
@@ -7,11 +7,23 @@ let ipcRenderer = null;
|
|
|
if (isElectron()) {
|
|
|
try { ipcRenderer = window.require('electron').ipcRenderer; } catch {}
|
|
|
}
|
|
|
-
|
|
|
+//避免obj是递归引用导致崩溃
|
|
|
+function safeStringify(obj) {
|
|
|
+ const cache = new Set();
|
|
|
+ return JSON.stringify(obj, (key, value) => {
|
|
|
+ if (typeof value === 'object' && value !== null) {
|
|
|
+ if (cache.has(value)) {
|
|
|
+ return '[Circular]';
|
|
|
+ }
|
|
|
+ cache.add(value);
|
|
|
+ }
|
|
|
+ return value;
|
|
|
+ });
|
|
|
+}
|
|
|
function proxyLog(level) {
|
|
|
const original = console[level];
|
|
|
return (...args) => {
|
|
|
- const msg = args.map(v => typeof v === 'object' ? JSON.stringify(v) : String(v)).join(' ');
|
|
|
+ const msg = args.map(v => typeof v === 'object' ? safeStringify(v) : String(v)).join(' ');
|
|
|
original(...args); // ① 控制台始终打印
|
|
|
if (ipcRenderer) { // ② Electron 环境
|
|
|
ipcRenderer.invoke('write-log', level, msg).catch(() => {});
|
|
@@ -20,7 +32,7 @@ function proxyLog(level) {
|
|
|
fetch('/log', {
|
|
|
method: 'POST',
|
|
|
headers: { 'Content-Type': 'application/json' },
|
|
|
- body: JSON.stringify({ level, msg })
|
|
|
+ body: safeStringify({ level, msg })
|
|
|
}).catch(() => {}); // 404 也不抛错
|
|
|
}
|
|
|
};
|