' . $_log . ''; } elseif (stripos($_log, 'fatal') !== false) { echo '
' . $_log . '
'; } elseif (stripos($_log, 'warn') !== false OR stripos($_log, 'alert') !== false) { echo '
' . $_log . '
'; } elseif (stripos($_log, 'notice') !== false) { echo '
' . $_log . '
'; } else { echo '
' . $_log . '
'; } } /** * Filtre un log pour masquer les informations sensibles avant de l'afficher. * * @param string $_log Le message de log à filtrer. */ public static function filtreLog(string $_log){ $log = self::hidePassword($_log); $log = self::hideEmail($log); self::printLog($log); } /** * Détecte si une chaîne correspond au format des tentatives de connexion. * * @param string $str La chaîne à analyser. * @return bool Vrai si la chaîne correspond, faux sinon. */ private static function detectLogsAttempts(string $str): bool { return preg_match( '/^\d{1,3}(\.\d{1,3}){3},\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},/', $str ) === 1; } /** * Affiche un log formaté pour les tentatives de connexion. * * @param string $_log Le message de log à afficher. */ public static function printLogAttempts(string $_log){ $parts = explode(',', $_log, 4); if (count($parts) === 4) { echo '
' . '' . htmlspecialchars($parts[0]) . ', ' . '' . htmlspecialchars($parts[1]) . ', ' . '' . htmlspecialchars($parts[2]) . ', ' . '' . htmlspecialchars($parts[3]) . '' . '
'; return; } } /** * Détecte si une chaîne correspond au format des logs Apache. * * @param string $str La chaîne à analyser. * @return bool Vrai si la chaîne correspond, faux sinon. */ private static function detectApacheLog(string $str): bool { return preg_match( '/^\[(?[A-Za-z]{3} [A-Za-z]{3} \d{2} [\d:.]+ \d{4})\] \[(?[^\]]+)\] \[pid (?\d+):tid (?\d+)\] \[client (?[^\]]+)\] (?.*?)(?:, referer: (?.+))?$/', $str ) === 1; } /** * Affiche un log Apache avec des couleurs pour chaque partie. * * @param string $line La ligne de log Apache à afficher. */ public static function printColoredApacheLog(string $line) { $regex = '/^\[(?[A-Za-z]{3} [A-Za-z]{3} \d{2} [\d:.]+ \d{4})\] \[(?[^\]]+)\] \[pid (?\d+):tid (?\d+)\] \[client (?[^\]]+)\] (?.*?)(?:, referer: (?.+))?$/'; if (preg_match($regex, $line, $matches)) { echo '
' . '[' . htmlspecialchars($matches['date']) . '] ' . '[' . htmlspecialchars($matches['type']) . '] ' . '[pid ' . htmlspecialchars($matches['pid']) . ':tid ' . htmlspecialchars($matches['tid']) . '] ' . '[client ' . htmlspecialchars($matches['client']) . '] ' . '' . htmlspecialchars($matches['msg']) . ''; if (!empty($matches['referer'])) { echo ' referer: ' . htmlspecialchars($matches['referer']) . ''; } echo '
'; } else { echo '
' . htmlspecialchars($line) . '
'; } } /** * Vérifie si un log contient le chemin du dossier www. * * @param string $_log Le message de log à analyser. * @return bool Vrai si le chemin est trouvé, faux sinon. */ private static function ifFolderWww(string $_log){ return (stripos($_log, DOCUMENT_ROOT) !== false) ? TRUE : FALSE; } /** * Vérifie si un log contient le domaine CMS. * * @param string $_log Le message de log à analyser. * @return bool Vrai si le domaine est trouvé, faux sinon. */ private static function ifFolderDomain(string $_log){ return (stripos($_log, DOMAIN_CMS) !== false) ? TRUE : FALSE; } /** * Vérifie si un log est général (ni dossier www, ni domaine CMS). * * @param string $_log Le message de log à analyser. * @return bool Vrai si le log est général, faux sinon. */ private static function ifGeneral(string $_log){ return (stripos($_log, "/var/www/") == FALSE AND stripos($_log, "https://") == FALSE) ? TRUE : FALSE; } /** * Masque les mots de passe dans une chaîne de log. * * @param string $input La chaîne à traiter. * @return string La chaîne avec les mots de passe masqués. */ private static function hidePassword($input) { return preg_replace("/('password'\s*=>\s*)'[^']*'/", "$1'##PASSWORD##'", $input); } /** * Masque les adresses e-mail dans une chaîne de log. * * @param string $input La chaîne à traiter. * @return string La chaîne avec les adresses e-mail masquées. */ private static function hideEmail($input) { return preg_replace("/('email'\s*=>\s*)'[^']*'/", "$1'##EMAIL##'", $input); } /** * Affiche les logs d'un fichier dans la console, avec des options de recherche et de limite. * * @param string $_logFile Le chemin du fichier de log à lire. */ public static function consoleLog(string $_logFile){ if (!is_readable($_logFile)) { echo "Le fichier n'est pas accessible en lecture."; exit(); } $lines = file($_logFile); $search = strtolower($_GET['search'] ?? ''); $limit = strtolower($_GET['limit'] ?? 50); // A défaut les 50 derniers logs if ($search) { $lines = array_filter($lines, fn($line) => stripos($line, $search) !== false); } $lines = array_reverse($lines); foreach (array_slice($lines, 0, $limit) as $line) { serverLog::filtreLog($line); } } }