b2in/public/_cabinet/logger.php
2026-01-23 17:33:10 +01:00

94 lines
3.4 KiB
PHP

<?php
// logger.php - Optimiertes Logging für Cabinet Digital Signage
// Erlaubt CORS
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type");
header("Access-Control-Allow-Methods: POST, OPTIONS");
header("Content-Type: application/json");
// Handle OPTIONS preflight request
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit;
}
// Nur POST akzeptieren
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$input = file_get_contents('php://input');
$data = json_decode($input, true);
if ($data) {
$level = strtoupper($data['level'] ?? 'INFO');
$message = $data['message'] ?? 'n/a';
$timestamp = $data['timestamp'] ?? date('c');
$context = $data['context'] ?? [];
$viewport = $data['viewport'] ?? 'unknown';
$connection = $data['connection'] ?? 'unknown';
// Log-Eintrag mit strukturierten Daten
$logEntry = [
'timestamp' => 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']);
}