Classe Log : erreur mais où ?

Rechercher

Classe Log : erreur mais où ?

Par Tef  -  10 reponses  -  Le 25/01/2009 21:16  -  Editer  - 

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

Par Tef  -  Le 25/01/2009 22:30  -  Haut de page  - 

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

 
Par Emacs  -  Le 26/01/2009 13:00  -  Haut de page  - 

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 ;)

 
Par Tef  -  Le 26/01/2009 13:11  -  Haut de page  - 

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

 
Par Tef  -  Le 26/01/2009 18:43  -  Haut de page  - 

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

 
Par Tef  -  Le 26/01/2009 20:07  -  Haut de page  - 

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

 
Par Emacs  -  Le 27/01/2009 21:20  -  Haut de page  - 

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.

 
Par Tef  -  Le 27/01/2009 23:10  -  Haut de page  - 

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

 
Par Tef  -  Le 29/01/2009 20:34  -  Haut de page  - 

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

 

 

 

 
Par Tef  -  Le 29/01/2009 20:36  -  Haut de page  - 

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

 
Par Tef  -  Le 29/01/2009 22:24  -  Haut de page  - 

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

 

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |