如何同时将Electron crashReporter的minidump文件上传至远程服务器并本地存储?
解决Electron CrashReporter同时上传服务器与本地保留Dump文件的问题
我之前也碰到过一模一样的需求——既要把崩溃报告上传到远程服务器,又得在本地留一份.dmp文件以防上传失败。你遇到的情况其实是Electron的默认行为:当uploadToServer设为true时,它会在成功上传崩溃文件后自动清理本地的.dmp文件,所以你在临时目录里找不到它。
下面给你两个可靠的解决方案:
方案一:使用自定义上传器(Custom Uploader)备份文件
这是最直接的方法,利用Electron提供的customUploader钩子,在上传崩溃报告之前手动把.dmp文件复制到你指定的本地目录,之后再执行上传操作。
示例代码(主进程中):
const { app, crashReporter } = require('electron'); const fs = require('fs').promises; const path = require('path'); // 定义本地存储崩溃dump的目录,比如用应用的用户数据目录,不会被系统临时清理 const localCrashStorageDir = path.join(app.getPath('userData'), 'LocalCrashDumps'); // 确保目录存在 async function initLocalCrashDir() { try { await fs.access(localCrashStorageDir); } catch { await fs.mkdir(localCrashStorageDir, { recursive: true }); } } // 初始化崩溃报告器 async function setupCrashReporter() { await initLocalCrashDir(); crashReporter.start({ productName: 'YourAppName', submitURL: 'https://your-crash-report-server.com/upload', uploadToServer: true, customUploader: async (uploadOptions) => { // 从uploadOptions中获取dump文件的路径 const sourceDumpPath = uploadOptions.crashDmpPath; const dumpFileName = path.basename(sourceDumpPath); const targetDumpPath = path.join(localCrashStorageDir, dumpFileName); try { // 复制dump文件到本地目录 await fs.copyFile(sourceDumpPath, targetDumpPath); console.log(`本地备份崩溃dump成功:${targetDumpPath}`); } catch (err) { console.error('本地备份崩溃dump失败:', err); } // 执行默认的上传逻辑,也可以在这里实现自己的上传代码 return crashReporter.uploadCrashReport(uploadOptions); } }); } // 应用就绪后初始化 app.whenReady().then(setupCrashReporter);
方案二:监听崩溃事件手动备份(备选)
如果你不想自定义上传器,也可以尝试监听app的child-process-crashed事件(针对渲染进程崩溃),不过这种方法的可靠性不如自定义上传器,因为有些极端崩溃可能无法触发事件,仅作为补充方案:
app.on('child-process-crashed', (event, childProcess, details) => { // details中包含crash dump的路径,需根据Electron版本确认字段兼容性 if (details.crashDmp) { const targetPath = path.join(localCrashStorageDir, path.basename(details.crashDmp)); fs.copyFile(details.crashDmp, targetPath).catch(err => console.error(err)); } });
注意事项
- 一定要选择非临时目录来存储本地dump文件,比如应用的
userData目录,避免被系统的临时文件清理机制删掉。 - 确保应用有对应目录的读写权限,尤其是在Windows/macOS的沙箱环境下。
- 测试时可以通过
process.crash()在主进程触发崩溃,或者在渲染进程用window.crash()来验证功能是否正常。
内容的提问来源于stack exchange,提问作者aabuhijleh




