Classe Log : erreur mais où ?
Bonjour,
Voilà je me lance dans mes premiers codes. J'ai trouvé que ton idée Hugo de log me permettrait de bien comprendre les classes, le POO et toutes les nouveautés de PHP5. Alors le développement d'une classe Log était une superbe idée.
Donc dans un premier temps, je me suis dit : "Je vais faire une classe très très simple. Je veux juste déclarer une constante qui sera mon chemin de ma log et ensuite utiliser err_log pour insérer dans le fichier".
Bah c'est pas partie tiens.....
Voici le code :
class Log {
//const ERR_LOG_FILE = '/var/log/PHP/erreurs_php.log';
const ERR_LOG_FILE = '/home/stephane/temp/erreurs_php.log';
public function logguer($msg) {
$date = date('d/m/Y - H:i:s');
$log = 'Le ' .$date. ' : ' .$msg. "\n";
error_log($log, 3, self::ERR_LOG_FILE);
}
}
Mon fichier est déjà créé et j'ai tous les droits dessus. Nada il bouge pas d'un poil.
A force de la tourner dans tous les sens cette classe, je me dis que l'erreur est évidente et que je passe à côter.
Si quelqu'un à une idée, je vous remercie.
A+
Stéphane
Réponses apportées à cette discussion
J'ai oublié de donner des infos importantes :
ce code ci-dessus est dans un fichier nommé class.inc.php
j'ai ma fonction PDOConnect dans un fichier functions.inc.php :
$log = new log();
function PDOConnect ($sDSN, $sLogin, $sPassword) {
try {
$oPDO = new PDO($sDSN, $sLogin, $sPassword);
} catch(PDOException $e) {
die ('Erreur de connexion !');//.$e->getMessage());
$log->logguer(logException($e));
}
$oPDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $oPDO;
}
Et l'appelle se fait dans un fichier index.php :
require ('config.inc.php');
require ('class.inc.php');
require ('functions.inc.php');
PDOConnect(DB_DSN, DB_LOGIN, DB_PASSWORD);
Voilà.
Merci
Stéphane
Hello,
Utilise la fonction file_put_contents() pour écrire dans ton fichier. Pense à vérifier qu'il a bien les droits et le dossier aussi ;)
Je testerai ce soir. J'ai repris le taf aujourd'hui (bah oui plus de gastro et c'est pas plus mal...) ^__^
Par contre, la logique est bonne avec l'appel de la classe dans la function etc ?
Merci à toi Hugo
A+
Stéphane
Salut
Alors j'ai mis mon die('blablabla') en commentaire et j'ai laissé seulement mon $olog->logger('blablabla')
Et là, c'est le drame : Fatal error: Call to a member function logger() on a non-object in /var/www/temp/functions.inc.php on line 9
Bref c'est un pb de portée je pense et/ou je pense que je déclare mal tout ça. Mais j'arrive pas à comprendre mon erreur.
Déjà j'avais une grossière erreur : j'avais mis $olog = new log() alors que cela doit être $olog = new Log()
Après je ne sais pas...
Je suis preneur pour me pointer du doigt et me dire : "Stéphane toi t'es mauvais !!!" ^__^
Merci par avance.
Stéphane
Bon alors je sais où est mon pb mais je ne sais pas comment le résoudre. Concrètement et simplement :
J'ai une classe Log avec une fonction Logger. Dedans je fais tout bien je pense (reste à confirmer que tout est juste). Dans un autre fichier j'ai ma fonction PDOConnect. Et là j'ai besoin de la fonction Logger qui est dans la classe Log.
Le tout se fait appel dans un fichier index.php (voir plus haut).
Comment puis-je faire ? J'ai cherché sur le net mais pas trouvé mon bonheur.
Merci et désolé pour toutes mes questions ;-)
Stéphane le chiant
Essaie en t'inspirant de ça :
<?php class myLogger{ const NOTICE = 'notice'; const FATAL = 'fatal'; const WARNING = 'warning'; static protected $logFile = '/var/www/monsite.com/logs/app.log'; static public function log($message, $priority = self::NOTICE) { if (!file_exists(self::$logFile)) { throw new Exception(sprintf('%s does not exist', self::$logFile)); } if (!is_writeable(self::$logFile)) { throw new Exception(sprintf('%s is not writeable', self::$logFile)); } $logs = file_get_contents(self::$logFile); $logs.= sprintf('%s - %s - %s', date('Y-m-d H:i:s'), $priority, $message); if (!file_put_contents(self::$logFile, $logs)) { throw new Exception(sprintf('Unable to write log in %s', self::$logFile)); } return true; }}
Et tu l'utilises ainsi :
<?php $e = new Exception('Erreur fatale, connexion à la bdd impossible'); if (true !== myLogger::log($e->getMessage(), myLogger::FATAL)){ die('Impossible de logguer les erreurs...');}
Libre à toi ensuite de l'agrémenter pour faire figurer la stack trace de l'exception en plus dans les logs, ainsi que d'autres infos utiles au débug.
++
Hugo.
Super ! Merci Hugo.
Un dernier truc par rapport au classe : J'ai un fichier A qui contient ma classe, un fichier B qui contient une fonction et enfin un fichier C qui contient mes includes et l'appel de la fonction. Est-il possible d'utiliser cette classe du fichier A dans ma fonction du fichier B alors que les includes et l'appel de ma fonction est dans le fichier C (voir mes 2 premiers messages plus haut ;)) ?
En tout cas, merci bien Hugo c'est super sympa.
A+
Stéphane
Salut,
Je ne pense pas que tu es vu mon message Hugo. Ce n'est pas grave. En fait, j'ai trouvé ma réponse.
Je pense que je réflichissais pas logiquement et correctement. Je m'efforçais de faire une fonction dans un fichier à part et une classe dans l'autre et de joindre les deux en faisant des requires dans un autre fichier... Bref une usine à gaz !
J'ai revu ma logique et voici ce que cela donne :
<?php
class cPDO {
const ERR_LOG_FILE = '/var/log/PHP/erreurs_php.log';
function PDOConnect ($sDSN, $sLogin, $sPassword) {
try {
$oPDO = new PDO($sDSN, $sLogin, $sPassword);
} catch(PDOException $e) {
$oLog = new cLog;
$oLog->logger($e->getMessage());
echo 'Erreur. Veuillez nous excuser pour la gêne occasionnée.'; //Ceci est provisoire !! Une redirection sera préférée.
}
return $oPDO;
}
}
class cLog {
function logger($msg) {
$date = date('d/m/Y - H:i:s');
$log = $date. " : " .$msg. "\n";
error_log($log, 3, cPDO::ERR_LOG_FILE);
chmod(cPDO::ERR_LOG_FILE,0777);
}
}
?>
Alors une justification : Pourquoi avoir préféré error_log() à file_put_contents() ? La raison est simple, je n'arrive pas à gérer le saut de ligne à l'intérieur de mon fichier, malgré le "\n" avec file_put_contents().
Voilà ! Donc j'ai mon fichier config.inc.php qui contient tous mes define() et si je rends une valeur erronée, rien ne s'affichera sur ma page comme info sensible. Exemple du contenu de ma log :
29/01/2009 - 20:11:52 : SQLSTATE[HY000] [2005] Unknown MySQL server host 'localhosts' (1)
29/01/2009 - 20:12:15 : SQLSTATE[28000] [1045] Access denied for user 'rootq'@'localhost' (using password: YES)
29/01/2009 - 20:12:26 : SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost' (using password: YES)
29/01/2009 - 20:12:40 : SQLSTATE[42000] [1049] Unknown database 'bdtests'
29/01/2009 - 20:13:17 : could not find driver
Et ben je pense que ça a été laborieux pour une première mais très formateur ! J'espère aussi que je n'ai pas écrit n'importe quoi dans ce message !! lol
Merci à toi Hugo pour ton aide. Si tu vois des erreurs dans mon code, n'hésites pas ;)
A+
Stéphane
un truc que je viens tout juste de voir : ma constante n'a rien à faire dans ma classe cPDO !!! Y'a des fois ou je me demande ce que j'ai dans la tête ^__^
Ca va simplifier encore plus mon code ;)
A+
Stéphane
Voilà fini ! Je pense que l'on peut passer ce thread en résolu Hugo :)
Si ce code peut servir à quelqu'un ;)
<?php
class cPDO {
function PDOConnect ($sDSN, $sLogin, $sPassword) {
try {
$oPDO = new PDO($sDSN, $sLogin, $sPassword);
} catch(PDOException $e) {
$oLog = new cLog;
$oLog->logger($e->getMessage());
echo 'Erreur. Veuillez nous excuser pour la gêne occasionnée.'; //Ceci est provisoire !!
}
return $oPDO;
}
}
class cLog {
const DIR_LOG = 'logs';
const ERR_LOG_FILE = 'erreurs_php.log';
function logger($msg) {
$date = date('d/m/Y - H:i:s');
$log = $date. " : " .$msg. "\n";
if (!is_dir(self::DIR_LOG)) {
mkdir(self::DIR_LOG, 0777);
}
error_log($log,3,self::DIR_LOG.'/'.self::ERR_LOG_FILE);
}
}
?>
A+
Stéphane