feat: 统一日志系统——结构化滚动文件 + api.log 插件通道 + 73 个 IPC 通道追踪 + pi 事件/渲染层错误归档
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user