From 9e63a9374f8007904b8f24c5b77aebe71e2d7418 Mon Sep 17 00:00:00 2001 From: Minoricew <154642983+Minoricew@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:59:57 +0800 Subject: [PATCH] [Feat] Log file auto cleanup (#15) & Improve logger experience Co-authored-by: TianMiao --- src/aura/init/main/ipcHandler.js | 7 +- src/aura/init/main/logger.js | 111 +++++++++++++++++++++++++++++++ src/core/hook.js | 70 +------------------ 3 files changed, 117 insertions(+), 71 deletions(-) create mode 100644 src/aura/init/main/logger.js diff --git a/src/aura/init/main/ipcHandler.js b/src/aura/init/main/ipcHandler.js index 8cdddcc..8f8b080 100755 --- a/src/aura/init/main/ipcHandler.js +++ b/src/aura/init/main/ipcHandler.js @@ -64,9 +64,12 @@ const buildIpcMain = (electron) => { } else { const isWindowValid = global.__HUGO_AURA__.hookedWindows.has(windowKey); if (!isWindowValid) { - throw new Error( - `[HugoAura / Main / IPC / ERROR] Unknown windowKey: ${windowKey}` + console.warn( + `[HugoAura / Main / IPC / WARN] Unknown windowKey: ${windowKey}, window may not have started yet.` ); + return { + success: false, + }; } sendDataToWebContents(windowKey, channel, data); diff --git a/src/aura/init/main/logger.js b/src/aura/init/main/logger.js new file mode 100644 index 0000000..a59d0b8 --- /dev/null +++ b/src/aura/init/main/logger.js @@ -0,0 +1,111 @@ +const path = require("path"); +const fs = require("fs"); +const os = require("os"); +const util = require("util"); + +/** + * + * @param {import("../aura/types/main/core").WindowName} windowName + */ +const initLogger = (windowName) => { + const logDir = path.join(os.homedir(), "Documents", "HugoAura", "logs"); + if (!fs.existsSync(logDir)) { + fs.mkdirSync(logDir, { recursive: true }); + } + + cleanupOldLogs(logDir); + const logFile = getLogFileName(logDir); + const logStream = fs.createWriteStream(logFile, { flags: "a" }); + + const timestamp = new Date().toISOString(); + const startupMsg = `\n=== [${timestamp}] HugoAura 窗口启动: ${windowName} ===\n\n`; + logStream.write(startupMsg); + + const originalConsole = { + log: console.log, + error: console.error, + warn: console.warn, + info: console.info, + debug: console.debug, + }; + + console.log = function (...args) { + const msg = util.format(`[LOG] <${windowName}>`, ...args) + "\n"; + logStream.write(msg); + originalConsole.log.apply(console, args); + }; + + console.error = function (...args) { + const msg = util.format(`[ERROR] <${windowName}>`, ...args) + "\n"; + logStream.write(msg); + originalConsole.error.apply(console, args); + }; + + console.warn = function (...args) { + const msg = util.format(`[WARN] <${windowName}>`, ...args) + "\n"; + logStream.write(msg); + originalConsole.warn.apply(console, args); + }; + + console.info = function (...args) { + const msg = util.format(`[INFO] <${windowName}>`, ...args) + "\n"; + logStream.write(msg); + originalConsole.info.apply(console, args); + }; + + console.debug = function (...args) { + if (!process.argv.includes("--aura-debug")) return; + const msg = util.format(`[DEBUG] <${windowName}>`, ...args) + "\n"; + logStream.write(msg); + originalConsole.debug.apply(console, args); + }; + + process.on("uncaughtException", (err) => { + console.error("[CRITICAL] UNCAUGHT EXCEPTION:", err); + }); + + console.log( + "[HugoAura / Logger] Logger initialized. Log file:", + logFile + ); +}; + +const cleanupOldLogs = (logDir) => { + try { + const files = fs.readdirSync(logDir); + const now = new Date(); + const sevenDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000); + + files.forEach((file) => { + if (file.endsWith(".log")) { + const filePath = path.join(logDir, file); + const stats = fs.statSync(filePath); + + // 如果文件创建时间超过 30 天, 则删除 + if (stats.birthtime < sevenDaysAgo) { + fs.unlinkSync(filePath); + console.log( + `[HugoAura / Logger / Cleanup] Cleaned log file: ${file}` + ); + } + } + }); + } catch (error) { + console.error("[HugoAura / Logger / Cleanup] Unexpected error occurred cleaning log file:", error); + } +}; + +/** + * 生成每日 Log 文件路径 + * @param {string} logDir 日志目录路径 + * @param {string} _windowName 窗口名称 (暂时无用) + * @returns {string} 日志文件路径 + */ +const getLogFileName = (logDir, _windowName) => { + const today = new Date(); + const dateStr = today.toISOString().split("T")[0]; // YYYY-MM-DD 格式 + const logFileName = `HugoAura-SSA-${dateStr}.log`; + return path.join(logDir, logFileName); +}; + +module.exports = { initLogger }; diff --git a/src/core/hook.js b/src/core/hook.js index 2bde0ae..96b2457 100755 --- a/src/core/hook.js +++ b/src/core/hook.js @@ -30,11 +30,6 @@ if (!global.__HUGO_AURA_CONFIG__) { global.__HUGO_AURA_CONFIG__ = {}; } -const fs = require("fs"); -const util = require("util"); -const path = require("path"); -const os = require("os"); - const MainProcessHooksManager = require("../aura/init/main/windowHooksManager"); const RendererHooksManager = require("../aura/init/rendererHook/uiHooksManager"); const EventBus = require("../aura/utils/eventBus"); @@ -42,70 +37,7 @@ const NetworkHook = require("../aura/init/rendererHook/networkHook"); const ConfigManager = require("../aura/init/shared/configManager"); const { buildIpcMain } = require("../aura/init/main/ipcHandler"); -/** - * - * @param {import("../aura/types/main/core").WindowName} windowName - */ -const initLogger = (windowName) => { - const logDir = path.join(os.homedir(), "Documents", "HugoAura", "logs"); - if (!fs.existsSync(logDir)) { - fs.mkdirSync(logDir, { recursive: true }); - } - - const logFile = path.join( - logDir, - `main-${windowName}-${new Date().toISOString().replace(/:/g, "-")}.log` - ); - const logStream = fs.createWriteStream(logFile, { flags: "a" }); - - const originalConsole = { - log: console.log, - error: console.error, - warn: console.warn, - info: console.info, - debug: console.debug, - }; - - console.log = function (...args) { - const msg = util.format("[LOG] ", ...args) + "\n"; - logStream.write(msg); - originalConsole.log.apply(console, args); - }; - - console.error = function (...args) { - const msg = util.format("[ERROR] ", ...args) + "\n"; - logStream.write(msg); - originalConsole.error.apply(console, args); - }; - - console.warn = function (...args) { - const msg = util.format("[WARN] ", ...args) + "\n"; - logStream.write(msg); - originalConsole.warn.apply(console, args); - }; - - console.info = function (...args) { - const msg = util.format("[INFO] ", ...args) + "\n"; - logStream.write(msg); - originalConsole.info.apply(console, args); - }; - - console.debug = function (...args) { - if (!process.argv.includes("--aura-debug")) return; - const msg = util.format("[DEBUG] ", ...args) + "\n"; - logStream.write(msg); - originalConsole.debug.apply(console, args); - }; - - process.on("uncaughtException", (err) => { - console.error("UNCAUGHT EXCEPTION:", err); - }); - - console.log( - "[HugoAura / Init / Logger] Logger initialized. Log file:", - logFile - ); -}; +const { initLogger } = require("../aura/init/main/logger"); /** *