【Electron】集成日志 GitHub path安装install npmpackage:npm install electron-log主进程electron-log/main/** * file 日志模块 - 统一管理 Electron 主进程日志 * description 负责日志目录初始化、文件滚动、级别控制、自动清理以及渲染进程日志捕获。 */import{app}fromelectron;importlogfromelectron-log;import*asfsfromnode:fs;import*aspathfromnode:path;import{storeUrl}from../utils/path;// 用户文档根目录ViefongChat Files/** * 初始化主进程日志系统 * * 执行流程按顺序 * 1. 提前初始化 IPC 通道确保渲染进程 Preload 能顺利调用日志方法不拦截 console避免干扰预加载逻辑 * 2. 在用户文档中创建专属日志目录ViefongChat Files/logs * 3. 配置日志格式、按本地时区生成每日文件名、单文件大小限制5MB 自动滚动 * 4. 根据运行环境开发/生产调整日志输出级别 * 5. 启动全局异常捕获未处理异常 Promise 拒绝 * 6. 自动清理超过 30 天的旧日志文件 */exportfunctioninitLogger(){// 1. 核心时序优先开启渲染进程 IPC 通道 // 必须在任何窗口创建之前执行否则渲染进程的 preload 脚本可能因找不到日志方法而报错。// 这里不拦截渲染进程的 console因为我们在 preload 中自行通过 IPC 转发日志避免重复。log.initialize({spyRendererConsole:false});// 2. 路径与目录准备 constlogDirpath.join(storeUrl,logs);// 确保日志目录存在若不存在则递归创建防止因权限问题导致后续写入失败if(!fs.existsSync(logDir)){fs.mkdirSync(logDir,{recursive:true});}// 3. 日志格式与文件名配置 // 时间戳精确到毫秒并包含日志级别便于事后按时间线还原现场log.transports.file.format[{y}-{m}-{d} {h}:{i}:{s}.{ms}] [{level}] {text};// 使用本地时区生成日志文件名避免 UTC 时差导致早上 0-8 点的日志误写入前一天文件constlocalDatenewDate();constyearlocalDate.getFullYear();constmonthString(localDate.getMonth()1).padStart(2,0);constdayString(localDate.getDate()).padStart(2,0);constcurrentFileNamemain-${year}-${month}-${day}.log;log.transports.file.fileNamecurrentFileName;// 强制将日志写入到自定义目录而非 Electron 默认的临时目录AppData 或 ~/Library/Logslog.transports.file.resolvePathFn()path.join(logDir,currentFileName);// 单文件达到 5MB 时自动滚动重命名旧文件创建新文件避免单个文件过大log.transports.file.maxSize5*1024*1024;// 4. 环境敏感的输出级别控制 if(app.isPackaged){// 生产环境仅记录 warn 及以上级别到文件控制台完全静默减少磁盘 I/O避免暴露内部信息log.transports.file.levelwarn;log.transports.console.levelfalse;}else{// 开发环境info 及以上写入文件debug 及以上打印到控制台便于实时调试log.transports.file.levelinfo;log.transports.console.leveldebug;}// 5. 全局异常捕获 // 捕获主进程中未被 try/catch 包裹的异常和未处理的 Promise 拒绝统一写入日志log.errorHandler.startCatching();log.info(Viefong 日志模块已成功绑定至自定义目录:${logDir});// 6. 启动时自动清理过期日志 // 删除 30 天前的 .log 文件避免用户磁盘被无限堆积try{cleanOldLogs(logDir,30);}catch(err){console.error(【自动清理】执行旧日志回收失败:,err);}}/** * 删除指定目录下超过保留天数的 .log 文件 * * param logDir 日志目录路径 * param maxDays 最大保留天数单位天例如 30 表示只保留最近 30 天的日志 */functioncleanOldLogs(logDir:string,maxDays:number){if(!fs.existsSync(logDir))return;constfilesfs.readdirSync(logDir);constnowDate.now();constexpirationTimemaxDays*24*60*60*1000;files.forEach((file){if(file.endsWith(.log)){constfilePathpath.join(logDir,file);conststatfs.statSync(filePath);if(now-stat.mtimeMsexpirationTime){fs.unlinkSync(filePath);console.log([Log GC] 已删除过期的日志文件:${file});}}});}// 导出已配置的 log 实例供其他模块主进程、子进程等直接使用exportdefaultlog;渲染进程: electron-log/rendererimportlogfromelectron-log/rendererlog.error|warn|info|verbose|debug|silly子进程importprintLogfromelectron-log/node// 需要配置setAppName若是不知道程序昵称则去package.json中看name是什么就对应写什么printLog.transports.file.setAppName(程序昵称);