Updated log system

This commit is contained in:
2025-10-13 16:52:33 -04:00
parent a2ea19bc53
commit 44abfd96d7
3 changed files with 112 additions and 31 deletions
+7 -3
View File
@@ -2623,12 +2623,14 @@ def api_log_stats():
stats = logger_handler.get_log_statistics(days=days) stats = logger_handler.get_log_statistics(days=days)
print(f"📈 Retrieved stats: {stats}") print(f"📈 Retrieved stats: {stats}")
# Ensure all expected keys exist # Ensure all expected keys exist with updated categories
expected_stats = { expected_stats = {
'total_events': stats.get('total_events', 0), 'total_events': stats.get('total_events', 0),
'security_events': stats.get('security_events', 0), 'security_events': stats.get('security_events', 0),
'authentication_events': stats.get('authentication_events', 0),
'qr_management_events': stats.get('qr_management_events', 0),
'database_errors': stats.get('database_errors', 0), 'database_errors': stats.get('database_errors', 0),
'user_activities': stats.get('user_activities', 0), 'application_events': stats.get('application_events', 0),
'system_events': stats.get('system_events', 0) 'system_events': stats.get('system_events', 0)
} }
@@ -2648,8 +2650,10 @@ def api_log_stats():
'stats': { 'stats': {
'total_events': 0, 'total_events': 0,
'security_events': 0, 'security_events': 0,
'authentication_events': 0,
'qr_management_events': 0,
'database_errors': 0, 'database_errors': 0,
'user_activities': 0, 'application_events': 0,
'system_events': 0 'system_events': 0
} }
}), 500 }), 500
+15 -6
View File
@@ -608,15 +608,17 @@ class AppLogger:
def get_log_statistics(self, days=7): def get_log_statistics(self, days=7):
"""Get logging statistics for the specified number of days""" """Get logging statistics for the specified number of days"""
try: try:
from datetime import datetime, timedelta # Import here as backup from datetime import datetime, timedelta
cutoff_date = datetime.now() - timedelta(days=days) cutoff_date = datetime.now() - timedelta(days=days)
# Initialize default stats # Initialize default stats with all categories
stats = { stats = {
'total_events': 0, 'total_events': 0,
'security_events': 0, 'security_events': 0,
'authentication_events': 0,
'qr_management_events': 0,
'database_errors': 0, 'database_errors': 0,
'user_activities': 0, 'application_events': 0,
'system_events': 0 'system_events': 0
} }
@@ -663,12 +665,17 @@ class AppLogger:
count = row.event_count count = row.event_count
print(f"✅ Found {count} events in category: {category}") print(f"✅ Found {count} events in category: {category}")
# Map categories to stats keys
if category == 'security': if category == 'security':
stats['security_events'] = count stats['security_events'] = count
elif category == 'authentication':
stats['authentication_events'] = count
elif category == 'qr_management':
stats['qr_management_events'] = count
elif category == 'database': elif category == 'database':
stats['database_errors'] = count stats['database_errors'] = count
elif category == 'user_activity': elif category == 'application':
stats['user_activities'] = count stats['application_events'] = count
elif category == 'system': elif category == 'system':
stats['system_events'] = count stats['system_events'] = count
@@ -684,8 +691,10 @@ class AppLogger:
return { return {
'total_events': 0, 'total_events': 0,
'security_events': 0, 'security_events': 0,
'authentication_events': 0,
'qr_management_events': 0,
'database_errors': 0, 'database_errors': 0,
'user_activities': 0, 'application_events': 0,
'system_events': 0 'system_events': 0
} }
+90 -22
View File
@@ -33,14 +33,14 @@ Management{% endblock %} {% block extra_head %}
<!-- Log Statistics --> <!-- Log Statistics -->
<div class="log-stats"> <div class="log-stats">
<div class="stat-card total"> <div class="stat-card total">
<div class="stat-icon"> <div class="stat-icon total">
<i class="fas fa-list"></i> <i class="fas fa-list-alt"></i>
</div> </div>
<div class="stat-info"> <div class="stat-info">
<h3 id="totalEventsCount"> <h3 id="totalEventsCount">
{{ log_stats.total_events if log_stats else 0 }} {{ log_stats.total_events if log_stats else 0 }}
</h3> </h3>
<p>Total Events (7 days)</p> <p>Total Events</p>
</div> </div>
</div> </div>
@@ -56,9 +56,33 @@ Management{% endblock %} {% block extra_head %}
</div> </div>
</div> </div>
<div class="stat-card errors"> <div class="stat-card auth">
<div class="stat-icon errors"> <div class="stat-icon auth">
<i class="fas fa-exclamation-triangle"></i> <i class="fas fa-user-shield"></i>
</div>
<div class="stat-info">
<h3 id="authEventsCount">
{{ log_stats.authentication_events if log_stats else 0 }}
</h3>
<p>Authentication</p>
</div>
</div>
<div class="stat-card qr">
<div class="stat-icon qr">
<i class="fas fa-qrcode"></i>
</div>
<div class="stat-info">
<h3 id="qrEventsCount">
{{ log_stats.qr_management_events if log_stats else 0 }}
</h3>
<p>QR Management</p>
</div>
</div>
<div class="stat-card database">
<div class="stat-icon database">
<i class="fas fa-database"></i>
</div> </div>
<div class="stat-info"> <div class="stat-info">
<h3 id="databaseErrorsCount"> <h3 id="databaseErrorsCount">
@@ -68,15 +92,15 @@ Management{% endblock %} {% block extra_head %}
</div> </div>
</div> </div>
<div class="stat-card users"> <div class="stat-card application">
<div class="stat-icon users"> <div class="stat-icon application">
<i class="fas fa-users"></i> <i class="fas fa-cogs"></i>
</div> </div>
<div class="stat-info"> <div class="stat-info">
<h3 id="userActivitiesCount"> <h3 id="applicationEventsCount">
{{ log_stats.user_activities if log_stats else 0 }} {{ log_stats.application_events if log_stats else 0 }}
</h3> </h3>
<p>User Activities</p> <p>Application Events</p>
</div> </div>
</div> </div>
</div> </div>
@@ -121,16 +145,18 @@ Management{% endblock %} {% block extra_head %}
<select id="categoryFilter" class="filter-select"> <select id="categoryFilter" class="filter-select">
<option value="">All Categories</option> <option value="">All Categories</option>
<option value="security">Security Events</option> <option value="security">Security Events</option>
<option value="authentication">Authentication</option>
<option value="qr_management">QR Management</option>
<option value="database">Database Events</option> <option value="database">Database Events</option>
<option value="user_activity">User Activities</option> <option value="application">Application Events</option>
<option value="system">System Events</option> <option value="system">System Events</option>
</select> </select>
<select id="severityFilter" class="filter-select"> <select id="severityFilter" class="filter-select">
<option value="">All Severity</option> <option value="">All Severity</option>
<option value="HIGH">High</option> <option value="CRITICAL">Critical</option>
<option value="MEDIUM">Medium</option> <option value="ERROR">Error</option>
<option value="LOW">Low</option> <option value="WARNING">Warning</option>
<option value="INFO">Info</option> <option value="INFO">Info</option>
</select> </select>
@@ -559,18 +585,44 @@ Management{% endblock %} {% block extra_head %}
// Load log statistics // Load log statistics
async function loadStats() { async function loadStats() {
try { try {
const response = await fetch( console.log("📊 Loading statistics...");
`/api/logs/stats?days=${currentFilters.days}` const days = currentFilters.days;
);
const data = await response.json();
if (data.success && data.stats) { const response = await fetch(`/api/logs/stats?days=${days}`, {
updateStatsDisplay(data.stats); method: "GET",
headers: {
"Content-Type": "application/json",
},
});
const data = await response.json();
console.log("📈 Stats received:", data);
if (data.success) {
const stats = data.stats;
// Update stat cards with new categories
document.getElementById("totalEventsCount").textContent =
stats.total_events || 0;
document.getElementById("securityEventsCount").textContent =
stats.security_events || 0;
document.getElementById("authEventsCount").textContent =
stats.authentication_events || 0;
document.getElementById("qrEventsCount").textContent =
stats.qr_management_events || 0;
document.getElementById("databaseErrorsCount").textContent =
stats.database_errors || 0;
document.getElementById("applicationEventsCount").textContent =
stats.application_events || 0;
console.log("✅ Statistics updated successfully");
} else { } else {
console.error("Failed to load stats:", data.error); console.error("Failed to load stats:", data.error);
showError("Failed to load statistics: " + (data.error || "Unknown error"));
} }
} catch (error) { } catch (error) {
console.error("Error loading stats:", error); console.error("Error loading stats:", error);
showError("Failed to load statistics: " + error.message);
} }
} }
@@ -1325,6 +1377,21 @@ ${
box-shadow: var(--shadow-lg); box-shadow: var(--shadow-lg);
} }
/* Auth stat card styling */
.stat-card.auth .stat-icon {
background: linear-gradient(135deg, #667eea, #764ba2);
}
/* QR Management stat card styling */
.stat-card.qr .stat-icon {
background: linear-gradient(135deg, #f093fb, #f5576c);
}
/* Application stat card styling */
.stat-card.application .stat-icon {
background: linear-gradient(135deg, #4facfe, #00f2fe);
}
.stat-icon { .stat-icon {
width: 60px; width: 60px;
height: 60px; height: 60px;
@@ -1353,6 +1420,7 @@ ${
background: linear-gradient(135deg, var(--success-color), #059669); background: linear-gradient(135deg, var(--success-color), #059669);
} }
.stat-info h3 { .stat-info h3 {
font-size: var(--font-size-2xl); font-size: var(--font-size-2xl);
font-weight: 700; font-weight: 700;