date('Y-m-d H:i:s'), 'iso_timestamp' => $timestamp, 'level' => $level, 'message' => $message, 'ip' => $_SERVER['REMOTE_ADDR'] ?? 'unknown', 'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? 'unknown', 'viewport' => $viewport, 'connection' => $connection, 'context' => $context ]; // Log-Datei basierend auf Level $logFile = __DIR__ . '/logs/' . strtolower($level) . '_' . date('Y-m-d') . '.log'; $allLogsFile = __DIR__ . '/logs/all_' . date('Y-m-d') . '.log'; // Logs-Verzeichnis erstellen falls nicht vorhanden $logsDir = __DIR__ . '/logs'; if (!is_dir($logsDir)) { mkdir($logsDir, 0755, true); } // Formatierte Log-Zeile (human-readable) $logLine = sprintf( "[%s] [%s] %s\n", date('Y-m-d H:i:s'), str_pad($level, 8), $message ); // Zusätzliche Kontext-Informationen wenn vorhanden if (!empty($context)) { $logLine .= " Context: " . json_encode($context, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . "\n"; } $logLine .= " IP: {$logEntry['ip']} | Viewport: {$viewport} | Connection: {$connection}\n"; $logLine .= str_repeat('-', 80) . "\n"; // JSON Log für maschinelle Verarbeitung $jsonLogLine = json_encode($logEntry, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . "\n"; $jsonLogFile = __DIR__ . '/logs/json_' . date('Y-m-d') . '.log'; // In Dateien schreiben file_put_contents($logFile, $logLine, FILE_APPEND | LOCK_EX); file_put_contents($allLogsFile, $logLine, FILE_APPEND | LOCK_EX); file_put_contents($jsonLogFile, $jsonLogLine, FILE_APPEND | LOCK_EX); // Log-Rotation: Dateien älter als 30 Tage löschen $files = glob($logsDir . '/*.log'); $now = time(); foreach ($files as $file) { if (is_file($file) && $now - filemtime($file) >= 30 * 24 * 3600) { unlink($file); } } // Erfolgsantwort echo json_encode(['status' => 'success', 'message' => 'Log received']); } else { http_response_code(400); echo json_encode(['status' => 'error', 'message' => 'Invalid JSON']); } } else { http_response_code(405); echo json_encode(['status' => 'error', 'message' => 'Method not allowed']); }