From 4abb9c2ea68864c19a5ef715844e8bf95b0bbd81 Mon Sep 17 00:00:00 2001 From: MacRimi Date: Sun, 12 Oct 2025 02:44:49 +0200 Subject: [PATCH] Update system-logs.tsx --- AppImage/components/system-logs.tsx | 164 +++++++++++++--------------- 1 file changed, 77 insertions(+), 87 deletions(-) diff --git a/AppImage/components/system-logs.tsx b/AppImage/components/system-logs.tsx index eb56df1..41f4f1a 100644 --- a/AppImage/components/system-logs.tsx +++ b/AppImage/components/system-logs.tsx @@ -82,6 +82,19 @@ interface SystemLog { hostname?: string } +interface CombinedLogEntry { + timestamp: string + level: string + service: string + message: string + source: string + pid?: string + hostname?: string + isEvent: boolean + eventData?: Event + sortTimestamp: number +} + export function SystemLogs() { const [logs, setLogs] = useState([]) const [backups, setBackups] = useState([]) @@ -95,6 +108,8 @@ export function SystemLogs() { const [serviceFilter, setServiceFilter] = useState("all") const [activeTab, setActiveTab] = useState("logs") + const [displayedLogsCount, setDisplayedLogsCount] = useState(500) + const [selectedLog, setSelectedLog] = useState(null) const [selectedEvent, setSelectedEvent] = useState(null) const [selectedBackup, setSelectedBackup] = useState(null) @@ -265,18 +280,11 @@ export function SystemLogs() { const handleDownloadLogs = async (type = "system") => { try { - let hours = 48 + const hours = 48 - if (filteredLogs.length > 0) { - const lastLog = filteredLogs[filteredLogs.length - 1] - const lastLogTime = new Date(lastLog.timestamp) - const now = new Date() - const diffMs = now.getTime() - lastLogTime.getTime() - const diffHours = Math.floor(diffMs / (1000 * 60 * 60)) - - // Download 48 hours from the last visible log - hours = 48 - } + // This part seems to be intended for system logs specifically, and might not apply directly to combined logs/events. + // For now, we'll keep it as is, assuming it's for a specific download scenario. + // If the intent is to download combined logs/events, this function would need modification. let url = getApiUrl(`/api/logs/download?type=${type}&hours=${hours}`) @@ -339,8 +347,22 @@ export function SystemLogs() { } } - // Filter logs - const filteredLogs = logs.filter((log) => { + const combinedLogs: CombinedLogEntry[] = [ + ...logs.map((log) => ({ ...log, isEvent: false, sortTimestamp: new Date(log.timestamp).getTime() })), + ...events.map((event) => ({ + timestamp: event.starttime, + level: event.level, + service: event.type, + message: `${event.type}${event.vmid ? ` (VM/CT ${event.vmid})` : ""} - ${event.status}`, + source: `Node: ${event.node} • User: ${event.user}`, + isEvent: true, + eventData: event, + sortTimestamp: new Date(event.starttime).getTime(), + })), + ].sort((a, b) => b.sortTimestamp - a.sortTimestamp) // Sort by timestamp descending + + // Filter combined logs + const filteredCombinedLogs = combinedLogs.filter((log) => { const matchesSearch = log.message.toLowerCase().includes(searchTerm.toLowerCase()) || log.service.toLowerCase().includes(searchTerm.toLowerCase()) @@ -350,6 +372,9 @@ export function SystemLogs() { return matchesSearch && matchesLevel && matchesService }) + const displayedLogs = filteredCombinedLogs.slice(0, displayedLogsCount) + const hasMoreLogs = displayedLogsCount < filteredCombinedLogs.length + const getLevelColor = (level: string) => { switch (level) { case "error": @@ -508,7 +533,7 @@ export function SystemLogs() { const getSectionLabel = (section: string) => { switch (section) { case "logs": - return "System Logs" + return "Logs & Events" case "events": return "Recent Events" case "backups": @@ -520,7 +545,7 @@ export function SystemLogs() { } } - if (loading && logs.length === 0) { + if (loading && logs.length === 0 && events.length === 0) { return (
@@ -530,7 +555,7 @@ export function SystemLogs() { return (
- {loading && logs.length > 0 && ( + {loading && (logs.length > 0 || events.length > 0) && (
@@ -544,12 +569,12 @@ export function SystemLogs() {
- Total Logs + Total Entries -
{logCounts.total}
-

Last 200 entries

+
{filteredCombinedLogs.length}
+

Filtered

@@ -603,9 +628,8 @@ export function SystemLogs() { - - System Logs - Recent Events + + Logs & Events Backups Notifications @@ -633,18 +657,7 @@ export function SystemLogs() { }} > - System Logs - -
- {/* System Logs Tab */}
setSearchTerm(e.target.value)} className="pl-10 bg-background border-border" @@ -746,26 +758,37 @@ export function SystemLogs() { onClick={() => handleDownloadLogs("system")} > - Export + Export Logs
- {filteredLogs.map((log, index) => ( + {displayedLogs.map((log, index) => (
{ - setSelectedLog(log) - setIsLogModalOpen(true) + if (log.isEvent) { + setSelectedEvent(log.eventData) + setIsEventModalOpen(true) + } else { + setSelectedLog(log as SystemLog) // Cast to SystemLog for dialog + setIsLogModalOpen(true) + } }} > -
+
{getLevelIcon(log.level)} {log.level.toUpperCase()} + {log.isEvent && ( + + + EVENT + + )}
@@ -777,7 +800,7 @@ export function SystemLogs() {
{log.message}
- Source: {log.source} + {log.source} {log.pid && ` • PID: ${log.pid}`} {log.hostname && ` • Host: ${log.hostname}`}
@@ -785,56 +808,23 @@ export function SystemLogs() {
))} - {filteredLogs.length === 0 && ( + {displayedLogs.length === 0 && (
-

No logs found matching your criteria

+

No logs or events found matching your criteria

)} -
- - - {/* Recent Events Tab */} - - -
- {events.map((event, index) => ( -
{ - setSelectedEvent(event) - setIsEventModalOpen(true) - }} - > -
- - {getLevelIcon(event.level)} - {event.status} - -
- -
-
-
- {event.type} - {event.vmid && ` (VM/CT ${event.vmid})`} -
-
{event.duration}
-
-
- Node: {event.node} • User: {event.user} -
-
{event.starttime}
-
-
- ))} - - {events.length === 0 && ( -
- -

No recent events found

+ {hasMoreLogs && ( +
+
)}