import { NextRequest, NextResponse } from 'next/server' import { getServerSession } from 'next-auth' import { authOptions } from '@/lib/auth' import { prisma } from '@/lib/prisma' import { exec } from 'child_process' import { promisify } from 'util' const execAsync = promisify(exec) /** * 获取系统日志(仅管理员) * 用于调试和监控系统状态 */ export async function GET(request: NextRequest) { try { // 验证管理员权限 const session = await getServerSession(authOptions) if (!session || !(session.user as any).id) { return NextResponse.json({ error: '未登录' }, { status: 401 }) } const user = await prisma?.user.findUnique({ where: { id: (session.user as any).id }, select: { role: true, isSuperAdmin: true } }) if (!user?.isSuperAdmin && user?.role !== 'ADMIN') { return NextResponse.json({ error: '无权限访问' }, { status: 403 }) } // 获取查询参数 const searchParams = request.nextUrl.searchParams const lines = parseInt(searchParams.get('lines') || '100') const keyword = searchParams.get('keyword') || '' // 读取最近的日志 let cmd = `docker logs --tail ${lines} youyidian-3d-material 2>&1` if (keyword) { cmd += ` | grep -i "${keyword}" || docker logs --tail ${lines} youyidian-3d-material 2>&1` } const { stdout, stderr } = await execAsync(cmd, { maxBuffer: 10 * 1024 * 1024, // 10MB timeout: 10000, }) const logs = stdout || stderr return NextResponse.json({ success: true, lines: logs.split('\n').length, logs: logs.substring(0, 50000), // 限制返回大小 truncated: logs.length > 50000, }) } catch (error) { console.error('[SystemLogs] Error:', error) return NextResponse.json( { error: error instanceof Error ? error.message : '获取日志失败', logs: '', }, { status: 500 } ) } }