{ "meta": { "title": "ProxMenux Monitor — Dashboard: System Logs tab | ProxMenux Documentation", "description": "The System Logs tab consolidates three sources into one screen: live journalctl with filters and download, Proxmox task history (UPIDs), and notification log — all searchable, filterable by severity / time range, and downloadable as text bundles." }, "header": { "title": "Dashboard: System Logs tab", "description": "Three sub-tabs under one roof: the system journal (journalctl with filters), Proxmox task history, and the notification log. All three are searchable, filterable and downloadable as text bundles.", "section": "ProxMenux Monitor · Dashboard" }, "readOnly": { "title": "Read-only by design", "body": "Nothing on this tab modifies log files. Filters live in the URL / state, downloads are server-side bundles. The dashboard never deletes log entries — for housekeeping use the host's own journalctl --vacuum-time=<N> or logrotate." }, "topRow": { "heading": "Top row: four counters", "items": [ "Total Entries — number of log records inside the active filter window.", "Errors — count of severity ≤ 3 (err / crit / alert / emerg).", "Warnings — count of severity 4 (warning).", "Backups — count of vzdump / PBS task entries in the same window." ] }, "subtabs": { "heading": "Three sub-tabs", "logsTitle": "Logs", "logsIntro": "The system journal, served by journalctl on the backend. Filters available in the toolbar:", "logsFilters": [ "Severity — emerg / alert / crit / err / warning / notice / info / debug, or any combination.", "Time range — last 5 min / 15 min / 1 h / 6 h / 24 h / 7 d / custom.", "Free-text search — substring or regex (journalctl --grep).", "Unit filter — restrict to a specific systemd unit (pveproxy.service, nginx.service, …)." ], "logsRowsAfter": "Each row shows timestamp, severity badge, source unit and the message. Long messages collapse with a \"show more\" toggle. The Download action bundles the current filter into a single .txt file via GET /api/logs/download — useful when you want to share a slice of journal with someone.", "logDetailsModalTitle": "Log Details modal", "logDetailsBody": "Clicking any row opens a Log Details modal with every structured field journald captured for that single entry — the same view you'd build by hand running journalctl --output=verbose on the host.", "logDetailsImageAlt": "Log Details modal — single journal entry expanded with Level, Service, Timestamp, Source, Systemd Unit, Process ID, Hostname and the full Message", "logDetailsImageCaption": "Log Details modal — every structured field journald carries for this entry, with the full untruncated message at the bottom. Useful for cron and service logs where the executed command line matters.", "fieldsIntro": "Fields shown:", "fields": [ "Level — coloured severity badge (INFO / WARNING / ERROR / CRITICAL).", "Service — short name of the unit / process that emitted the entry.", "Timestamp — full date and time of the log line.", "Source — origin of the entry (journal, kernel, audit, …).", "Systemd Unit — the actual .service / .timer / .socket unit if the entry was associated with one.", "Process ID — PID of the emitting process.", "Hostname — useful when journals are forwarded across cluster nodes.", "Message — the full untruncated message in a monospace block, ready to copy." ], "maxLevelStoreTitle": "Journald MaxLevelStore", "maxLevelStoreBody": "On a fresh Proxmox install, journald defaults to MaxLevelStore=warning, which silently drops info-level messages. The Monitor detects this on startup and adds a drop-in (/etc/systemd/journald.conf.d/proxmenux-loglevel.conf) raising the threshold to info so the Logs tab actually has something to show across all severities.", "backupsTitle": "Backups", "backupsBody": "Proxmox task history filtered to backup-related entries. One row per task (vzdump, PBS transfers, Garbage Collect, Verify) with the status (OK / WARNINGS / ERROR), guest involved, source storage, duration and the UPID. Click a row to load the full task log via GET /api/task-log/<upid> — the same data Proxmox exposes through Datacenter → Tasks, scoped to backups.", "notificationsTitle": "Notifications", "notificationsBody1": "Every notification dispatched by the Monitor — Telegram, Discord, Email, Gotify, ntfy, Slack, Teams, webhook. Each row: timestamp, channel, event type, severity, the rendered title, the rendered body, and (if AI is enabled) a toggle to view the AI rewrite next to the original.", "notificationsBody2": "Use this tab to verify a channel is actually delivering and to compare what the AI rewrite produced vs the template baseline. Channel configuration lives in the Notifications deep page." }, "dataCollected": { "heading": "How the data is collected", "headerSubtab": "Sub-tab", "headerEndpoint": "Endpoint", "headerSource": "Source", "rows": [ { "subtab": "Logs (live filter)", "endpoint": "/api/logs", "source": "journalctl --output json --since <range> with severity / unit / search filters applied server-side." }, { "subtab": "Download", "endpoint": "/api/logs/download", "source": "Same query, returned as plain text for grep / less." }, { "subtab": "Backups", "endpoint": "/api/backups", "source": "PVE task history filtered by vzdump, PBS transfers, Garbage Collect, Verify." }, { "subtab": "Backup task drill-in", "endpoint": "/api/task-log/<upid>", "source": "Plain-text full task log read from /var/log/pve/tasks/<index>/<upid>." }, { "subtab": "Notifications history", "endpoint": "/api/notifications/history", "source": "SQLite notification_history table fed by the dispatch loop." } ], "apiIntro": "Both the live filter and the downloads are also reachable via the API:", "codeComment1": "# Last hour of errors and worse, with a keyword", "codeComment2": "# Download the full journal of the last 6 hours as plain text", "codeComment3": "# Look up the full output of a specific task by UPID" }, "whereNext": { "heading": "Where to next", "items": [ { "label": "Health Monitor", "href": "/docs/monitor/health-monitor", "tail": " — the System Logs category that watches for persistent / spike / cascade patterns." }, { "label": "Notifications", "href": "/docs/monitor/notifications", "tail": " — the journal watcher reads the same source and turns matches into notifications." }, { "label": "API Reference", "href": "/docs/monitor/api", "tail": " — the logs and task-log endpoints with their query parameters." }, { "label": "Dashboard index", "href": "/docs/monitor/dashboard", "tail": " — the other tabs." } ] } }