feat: 统一日志系统——结构化滚动文件 + api.log 插件通道 + 73 个 IPC 通道追踪 + pi 事件/渲染层错误归档

This commit is contained in:
Rick Ye
2026-09-11 02:12:40 +08:00
parent 2ad1743e10
commit 8e4b5496e8
9 changed files with 332 additions and 98 deletions
+13 -5
View File
@@ -4,6 +4,10 @@ import { join } from 'node:path'
import { registerIpc } from './ipc'
import { getPluginHost } from './plugins/plugin-host'
import { getBrowserController } from './browser/browser-controller'
import { getLogger, initLogger } from './logger'
initLogger()
const log = getLogger('main')
process.env.APP_ROOT = join(__dirname, '..')
@@ -22,6 +26,7 @@ export const RENDERER_DIST = join(process.env.APP_ROOT, 'renderer')
const APP_ICON = join(app.getAppPath(), 'build', 'icon.ico')
const agentService = registerIpc()
log.info('main init', { version: app.getVersion(), packaged: app.isPackaged, devServer: VITE_DEV_SERVER_URL ?? '-' })
/** 窗口控制(自绘标题栏按钮走这三个 IPC;不使用系统 WCO,
* 否则 overlay 的原生白色背景会盖住标题栏分隔线) */
@@ -92,7 +97,7 @@ async function createWindow(): Promise<void> {
// pi 会话初始化放在窗口就绪后,错误可以第一时间在 UI 上呈现
agentService.ensureReady().catch((err: unknown) => {
sessionInitialized = false
console.error('[main] pi session init failed:', err)
log.error('pi session init failed', { err })
})
})
@@ -111,15 +116,17 @@ async function createWindow(): Promise<void> {
return { action: 'deny' }
})
// 渲染层日志/加载失败转发到主进程 stdout,便于排查白屏/黑屏问题
// 渲染层日志(含插件 renderer 模块 / iframe 页的 console)统一归档到日志文件
win.webContents.on('console-message', (details) => {
console.log(`[renderer:${details.level}] ${details.message} (${details.sourceId}:${details.lineNumber})`)
const level = details.level === 'error' ? 'error' : details.level === 'warning' ? 'warn' : 'debug'
if (level === 'debug' && !VITE_DEV_SERVER_URL) return
log[level]('renderer console', { message: details.message, source: `${details.sourceId}:${details.lineNumber}` })
})
win.webContents.on('did-fail-load', (_e, code, desc, url) => {
console.log(`[renderer:load-fail] ${code} ${desc} ${url}`)
log.error('renderer load failed', { code, desc, url })
})
win.webContents.on('render-process-gone', (_e, details) => {
console.log(`[renderer:gone] ${details.reason}`)
log.error('renderer gone', { reason: details.reason })
})
if (process.env.ASO_DEVTOOLS === '1') {
win.webContents.openDevTools({ mode: 'detach' })
@@ -150,6 +157,7 @@ if (!app.requestSingleInstanceLock()) {
app.setAppUserModelId('com.inkreach.agent')
}
Menu.setApplicationMenu(null)
log.info('app ready')
// 插件宿主:扫描/装载 + 协议映射 + 插件启停后重建 agent 运行时
const pluginHost = getPluginHost()