refactor: 添加回log功能~这次好用了~

This commit is contained in:
2025-09-02 18:20:20 +08:00
parent f4fe4ec019
commit 6b00c8a6be
11 changed files with 582 additions and 37 deletions

View File

@@ -13,6 +13,7 @@ import {
stopBackend,
} from './services/pythonService'
import { setMainWindow as setGitMainWindow, downloadGit, cloneBackend } from './services/gitService'
import { setupLogger, log, getLogPath, cleanOldLogs } from './services/logService'
// 检查是否以管理员权限运行
function isRunningAsAdmin(): boolean {
@@ -60,6 +61,8 @@ function restartAsAdmin(): void {
let mainWindow: BrowserWindow | null = null
function createWindow() {
log.info('开始创建主窗口')
mainWindow = new BrowserWindow({
width: 1600,
height: 1000,
@@ -77,13 +80,16 @@ function createWindow() {
mainWindow.setMenuBarVisibility(false)
const devServer = process.env.VITE_DEV_SERVER_URL
if (devServer) {
log.info(`加载开发服务器: ${devServer}`)
mainWindow.loadURL(devServer)
} else {
const indexHtmlPath = path.join(app.getAppPath(), 'dist', 'index.html')
log.info(`加载生产环境页面: ${indexHtmlPath}`)
mainWindow.loadFile(indexHtmlPath)
}
mainWindow.on('closed', () => {
log.info('主窗口已关闭')
mainWindow = null
})
@@ -92,6 +98,7 @@ function createWindow() {
setDownloadMainWindow(mainWindow)
setPythonMainWindow(mainWindow)
setGitMainWindow(mainWindow)
log.info('主窗口创建完成,服务引用已设置')
}
}
@@ -240,6 +247,62 @@ ipcMain.handle('reset-config', async () => {
})
// 日志文件操作
ipcMain.handle('get-log-path', async () => {
try {
return getLogPath()
} catch (error) {
log.error('获取日志路径失败:', error)
throw error
}
})
ipcMain.handle('get-logs', async (event, lines?: number) => {
try {
const logFilePath = getLogPath()
if (!fs.existsSync(logFilePath)) {
return ''
}
const logs = fs.readFileSync(logFilePath, 'utf8')
if (lines && lines > 0) {
const logLines = logs.split('\n')
return logLines.slice(-lines).join('\n')
}
return logs
} catch (error) {
log.error('读取日志文件失败:', error)
throw error
}
})
ipcMain.handle('clear-logs', async () => {
try {
const logFilePath = getLogPath()
if (fs.existsSync(logFilePath)) {
fs.writeFileSync(logFilePath, '', 'utf8')
log.info('日志文件已清空')
}
} catch (error) {
log.error('清空日志文件失败:', error)
throw error
}
})
ipcMain.handle('clean-old-logs', async (event, daysToKeep = 7) => {
try {
cleanOldLogs(daysToKeep)
log.info(`已清理${daysToKeep}天前的旧日志文件`)
} catch (error) {
log.error('清理旧日志文件失败:', error)
throw error
}
})
// 保留原有的日志操作方法以兼容现有代码
ipcMain.handle('save-logs-to-file', async (event, logs: string) => {
try {
const appRoot = getAppRoot()
@@ -252,9 +315,9 @@ ipcMain.handle('save-logs-to-file', async (event, logs: string) => {
const logFilePath = path.join(logsDir, 'app.log')
fs.writeFileSync(logFilePath, logs, 'utf8')
console.log(`日志已保存到: ${logFilePath}`)
log.info(`日志已保存到: ${logFilePath}`)
} catch (error) {
console.error('保存日志文件失败:', error)
log.error('保存日志文件失败:', error)
throw error
}
})
@@ -266,13 +329,13 @@ ipcMain.handle('load-logs-from-file', async () => {
if (fs.existsSync(logFilePath)) {
const logs = fs.readFileSync(logFilePath, 'utf8')
console.log(`从文件加载日志: ${logFilePath}`)
log.info(`从文件加载日志: ${logFilePath}`)
return logs
}
return null
} catch (error) {
console.error('加载日志文件失败:', error)
log.error('加载日志文件失败:', error)
return null
}
})
@@ -305,22 +368,42 @@ app.on('second-instance', () => {
app.on('before-quit', async event => {
// 只处理一次,避免多重触发
event.preventDefault()
log.info('应用准备退出')
try {
await stopBackend()
log.info('后端服务已停止')
} catch (e) {
log.error('停止后端时出错:', e)
console.error('停止后端时出错:', e)
} finally {
log.info('应用退出')
app.exit(0)
}
})
app.whenReady().then(() => {
// 初始化日志系统
setupLogger()
// 清理7天前的旧日志
cleanOldLogs(7)
log.info('应用启动')
log.info(`应用版本: ${app.getVersion()}`)
log.info(`Electron版本: ${process.versions.electron}`)
log.info(`Node版本: ${process.versions.node}`)
log.info(`平台: ${process.platform}`)
// 检查管理员权限
if (!isRunningAsAdmin()) {
log.warn('应用未以管理员权限运行')
console.log('应用未以管理员权限运行')
// 在生产环境中,可以选择是否强制要求管理员权限
// 这里先创建窗口,让用户选择是否重新启动
} else {
log.info('应用以管理员权限运行')
}
createWindow()
})