94 lines
3.4 KiB
PHP
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']);
|
|
}
|