5242880) { @rename($datei, $datei . '.1'); } $anfrage = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '-'; $methode = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : '-'; $referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '-'; $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '-'; $agent = isset($_SERVER['HTTP_USER_AGENT']) ? substr($_SERVER['HTTP_USER_AGENT'], 0, 120) : '-'; // Die Meldung einer ungefangenen Exception bringt den Stack-Trace mit. Der ist // das Wertvollste daran, aber mehrzeilig -- fuer eine Zeile pro Fehler wird er // auf die ersten Ebenen eingedampft. $meldung = preg_replace('/\s+/', ' ', trim($fehler['message'])); if (strlen($meldung) > 600) { $meldung = substr($meldung, 0, 600) . ' …'; } $zeile = sprintf( "[%s] FATAL | %s | %s:%d | %s %s | ref=%s | ip=%s | ua=%s\n", date('Y-m-d H:i:s'), $meldung, $fehler['file'], $fehler['line'], $methode, $anfrage, $referer, $ip, $agent ); @file_put_contents($datei, $zeile, FILE_APPEND | LOCK_EX); } catch (Throwable $e) { // Ein Protokoll, das selbst Fehler wirft, ist schlimmer als keins. } } /** * Wurde genau dieser Fehler gerade eben schon protokolliert? * * Schluessel ist Datei + Zeile + Meldung, Sperrfrist 60 Sekunden. Die Merkliste liegt * neben dem Log und wird nur im Fehlerfall angefasst -- im Normalbetrieb kostet diese * Datei nichts. */ function intelectra_fatal_log_schon_gesehen($fehler) { $merkdatei = __DIR__ . '/../logs/.fatal_seen.json'; $schluessel = md5($fehler['file'] . ':' . $fehler['line'] . ':' . $fehler['message']); $jetzt = time(); $gesehen = array(); if (is_readable($merkdatei)) { $roh = @file_get_contents($merkdatei); if ($roh) { $dekodiert = @json_decode($roh, true); if (is_array($dekodiert)) { $gesehen = $dekodiert; } } } if (isset($gesehen[$schluessel]) && ($jetzt - (int)$gesehen[$schluessel]) < 60) { return true; } // Abgelaufene Eintraege raus, damit die Datei nicht waechst. foreach ($gesehen as $k => $zeitpunkt) { if (($jetzt - (int)$zeitpunkt) > 3600) { unset($gesehen[$k]); } } $gesehen[$schluessel] = $jetzt; if (count($gesehen) > 200) { $gesehen = array_slice($gesehen, -200, 200, true); } @file_put_contents($merkdatei, json_encode($gesehen), LOCK_EX); return false; } } /* EOF */