import React, { useState, useEffect } from 'react'; import api from '../api'; import { reportError, logUserActionError } from '../utils/errorLogger'; const SystemLogsPage = ({ onNavigate, user }) => { const [activeTab, setActiveTab] = useState('login'); const [loginLogs, setLoginLogs] = useState([]); const [systemLogs, setSystemLogs] = useState([]); const [isLoading, setIsLoading] = useState(false); const [message, setMessage] = useState({ type: '', text: '' }); // 필터 상태 const [filters, setFilters] = useState({ status: '', level: '', userId: '', limit: 50 }); useEffect(() => { if (activeTab === 'login') { loadLoginLogs(); } else { loadSystemLogs(); } }, [activeTab, filters]); const loadLoginLogs = async () => { try { setIsLoading(true); const params = { limit: filters.limit, ...(filters.status && { status: filters.status }), ...(filters.userId && { user_id: filters.userId }) }; const response = await api.get('/auth/logs/login', { params }); if (response.data.success) { setLoginLogs(response.data.logs); } else { setMessage({ type: 'error', text: '로그인 로그를 불러올 수 없습니다' }); } } catch (err) { console.error('Load login logs error:', err); setMessage({ type: 'error', text: '로그인 로그 조회 중 오류가 발생했습니다' }); logUserActionError('load_login_logs', err, { userId: user?.user_id }); } finally { setIsLoading(false); } }; const loadSystemLogs = async () => { try { setIsLoading(true); const params = { limit: filters.limit, ...(filters.level && { level: filters.level }) }; const response = await api.get('/auth/logs/system', { params }); if (response.data.success) { setSystemLogs(response.data.logs); } else { setMessage({ type: 'error', text: '시스템 로그를 불러올 수 없습니다' }); } } catch (err) { console.error('Load system logs error:', err); setMessage({ type: 'error', text: '시스템 로그 조회 중 오류가 발생했습니다' }); logUserActionError('load_system_logs', err, { userId: user?.user_id }); } finally { setIsLoading(false); } }; const getStatusBadge = (status) => { const colors = { 'success': { bg: '#d1edff', color: '#0c5460' }, 'failed': { bg: '#f8d7da', color: '#721c24' } }; const color = colors[status] || colors.failed; return ( {status === 'success' ? '성공' : '실패'} ); }; const getLevelBadge = (level) => { const colors = { 'ERROR': { bg: '#f8d7da', color: '#721c24' }, 'WARNING': { bg: '#fff3cd', color: '#856404' }, 'INFO': { bg: '#d1ecf1', color: '#0c5460' }, 'DEBUG': { bg: '#e2e3e5', color: '#383d41' } }; const color = colors[level] || colors.INFO; return ( {level} ); }; const formatDateTime = (dateString) => { try { return new Date(dateString).toLocaleString('ko-KR', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }); } catch { return dateString; } }; return (
{/* 헤더 */}

📊 시스템 로그

로그인 기록과 시스템 오류 로그를 조회하세요

{/* 탭 메뉴 */}
{/* 필터 */}
{activeTab === 'login' && (
)} {activeTab === 'system' && (
)}
{/* 메시지 표시 */} {message.text && (
{message.text}
)} {/* 로그 테이블 */}

{activeTab === 'login' ? '로그인 로그' : '시스템 로그'} ({activeTab === 'login' ? loginLogs.length : systemLogs.length}개)

{isLoading ? (
로딩 중...
) : (
{activeTab === 'login' ? ( {loginLogs.length === 0 ? ( ) : ( loginLogs.map((log, index) => ( )) )}
시간 사용자 상태 IP 주소 실패 사유
로그인 로그가 없습니다
{formatDateTime(log.login_time)}
{log.name}
@{log.username}
{getStatusBadge(log.login_status)} {log.ip_address || '-'} {log.failure_reason || '-'}
) : ( {systemLogs.length === 0 ? ( ) : ( systemLogs.map((log, index) => ( )) )}
시간 레벨 모듈 메시지
시스템 로그가 없습니다
{formatDateTime(log.timestamp)} {getLevelBadge(log.level)} {log.module || '-'} {log.message}
)}
)}
); }; export default SystemLogsPage;