HelloCSE/app/Http/Utility/debug.php
2024-04-10 13:56:22 +02:00

179 lignes
Pas d'EOL
6,2 Kio
PHP

<?php
namespace App\Http\Utility;
use Illuminate\Support\Facades\Log;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Formatter\LineFormatter;
use App\Http\Controllers\Core\Exception;
class debug{
private static function obsafe_print_r($var, $return = false, $html = false, $level = 0, $prevTab='') {
$spaces = "";
$space = $html ? "&nbsp;" : " ";
$newline = $html ? "<br>" : "\n";
for ($i = 1; $i <= 6; $i++) {
$spaces .= $space;
}
$tabs = $spaces;
for ($i = 1; $i <= $level; $i++) {
$tabs .= $spaces;
}
if (is_array($var)) {
$title = "Array(";
} elseif (is_object($var)) {
$title = get_class($var)." Object(";
}
$output = $title . $newline . $newline;
foreach($var as $key => $value) {
if (is_array($value) || is_object($value)) {
$level++;
$value = self::obsafe_print_r($value, true, $html, $level,$tabs);
$level--;
}
$output .= $tabs . "[" . $key . "] => " . $value . $newline;
}
if ($return) return $output.$prevTab.')'. $newline;
else echo $output;
}
/*
Analyse, nettoie et converti un paramètre en une chaîne de caractère.
@param mixed $param : Paramètre à analyser.
@return string $text : Chaîne de retour.
*/
private static function parse($param,$HTMLArrayCompliant=false){
if(is_array($param) && !$HTMLArrayCompliant)
$param = print_r($param,true);
if((is_array($param) || is_object($param)) && $HTMLArrayCompliant)
$param=self::obsafe_print_r($param,true,true);
$param=str_replace("\n",' ',$param);
$text = str_replace(array("\t","\r"),'',$param);
//Remplacement des espaces successifs par un seul
if(is_string($text)){
$text = trim(preg_replace('/\s{2,}/', ' ', $text));
}
return $text;
}
/*
Écrit dans le log général de Laravel
@param mixed $toLog : Paramètre à analyser.
*/
public static function log($toLog,$HTMLArrayCompliant=false){
$callerbt = debug_backtrace();
$caller = $callerbt[0];
Log::debug('--=:::> '.self::parse($toLog,$HTMLArrayCompliant).' ['.$caller['function'].','.$caller['file'].','.$caller['line'].']');
}
/*
Écrit dans le log d'un module/entité en particulier
@param mixed $toLog : Paramètre à analyser.
@param string $logName : Nom du log servant au chemin et au fichier.
@param string $level : Niveau d'erreur :
[DEBUG] => 100
[INFO] => 200
[NOTICE] => 250
[WARNING] => 300
[ERROR] => 400
[CRITICAL] => 500
[ALERT] => 550
[EMERGENCY] => 600
@param array $data : Contexte du log
*/
public static function consign($toLog,$logName,$level='DEBUG',$data=[]){
$txt=self::parse($toLog);
$today=Date('Y-m-d');
$logName = trim($logName);
$logPath = '';
//Remplacement du double point ou du slash par du vide
if($logName==='..' || $logName==='/'){
$logName = '';
}
//Si le nom du log n'est pas vide, on rajoute le séparateur du dossier dans le chemin
if($logName!==''){
$logPath = $logName.DIRECTORY_SEPARATOR;
}
$path = storage_path('logs'.DIRECTORY_SEPARATOR.$logPath.$today.'_'.$logName.'.log');
//Ajout d'un emplacement d'écriture
$stream=new StreamHandler($path);
$levels=Logger::getLevels();
$levelCode=$level && array_key_exists($level,$levels)?$levels[$level]:$levels['DEBUG'];
//Création d'un nouveau canal de log
$log = new Logger($logName);
$formatter = new LineFormatter("[%datetime%] %channel%.%level_name%: %message% %context%\n", 'Y-m-d H:i:s');
$stream->setFormatter($formatter);
$log->pushHandler($stream);
//Ecriture dans le log
$log->addRecord($levelCode,$txt,$data);
}
public static function consignInto($toLog,$logName,$dir,$fileName,$level='DEBUG',$data=[]){
if(!empty($toLog))
throw new Exception(__METHOD__."consignInto ERROR:: toLog ne doit pas être vide");
if(!empty($logName))
throw new Exception(__METHOD__."consignInto ERROR:: logName ne doit pas être vide");
if(!empty($dir))
throw new Exception(__METHOD__."consignInto ERROR:: dir ne doit pas être vide");
if(!empty($fileName))
throw new Exception(__METHOD__."consignInto ERROR:: fileName ne doit pas être vide");
$txt=self::parse($toLog);
$today=Date('Y-m-d');
$logName = trim($logName);
$logPath = '';
// SECU : Remplacement du double point ou du slash par du vide
if($logName==='..' || $logName==='/'){
$logName = '';
}
//Si le nom du log n'est pas vide, on rajoute le séparateur du dossier dans le chemin
if($logName!==''){
$logPath = $logName.DIRECTORY_SEPARATOR;
}
if($dir!==''){
$logPath .= $dir.DIRECTORY_SEPARATOR;
}
$path = storage_path('logs'.DIRECTORY_SEPARATOR.$logPath.$today.'_'.$logName.'.log');
//Ajout d'un emplacement d'écriture
$stream=new StreamHandler($path);
$levels=Logger::getLevels();
$levelCode=$level && array_key_exists($level,$levels)?$levels[$level]:$levels['DEBUG'];
//Création d'un nouveau canal de log
$log = new Logger($logName);
$formatter = new LineFormatter("[%datetime%] %channel%.%level_name%: %message% %context%\n", 'Y-m-d H:i:s');
$stream->setFormatter($formatter);
$log->pushHandler($stream);
//Ecriture dans le log
$log->addRecord($levelCode,$txt,$data);
}
}