2013-05-14 2 views
4

Je travaille sur mon site depuis plus d'un an maintenant, et j'ai très hâte de le mettre à la disposition des gens. Il est devenu assez grand cependant - je veux presque dire hors de mon contrôle - et en plus de cela, je suis vraiment un programmeur amateur autodidacte. Donc, je veux être sûr que toutes les erreurs que php produit sont enregistrées dans un fichier, donc je peux accéder à ce fichier et suivre les erreurs.Comment changer la façon dont PHP écrit les erreurs dans le fichier journal des erreurs?

Actuellement mes paramètres sont les suivants:

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', '0'); 
ini_set('log_errors', 1); 
ini_set('error_log', 'errors.log'); 
?> 

fonctionne assez bien jusqu'à présent, mon fichier error.log contiendra des choses comme ceci:

[14-mai-2013 00:16 : 26] Note PHP: Variable indéfinie: nonexistentvariable in /home/www/dir/index.php on line 14 [14-May-2013 00:16:28] Note PHP: Variable non définie: nonexistentvariable in/home/www/dir /index.php à la ligne 14

Génial, les erreurs sont consignées.

Mais maintenant j'ai un problème:

  1. Ils sont en une seule ligne, pas de pauses. Cela rend la lecture difficile. Comment puis-je obtenir chaque erreur dans une nouvelle ligne?

  2. Je vois qu'il y a un horodatage. Impressionnant! Comment puis-je également ajouter des choses comme l'adresse IP de l'utilisateur, ou d'autres choses personnalisées?

Encore une fois, mes questions:

Comment changer la façon dont PHP écrit des erreurs dans le fichier journal des erreurs? En particulier, comment puis-je créer une nouvelle ligne après chaque erreur qui a été enregistrée, de sorte que le fichier error.log est plus facile à lire. Et comment puis-je ajouter des données et des valeurs personnalisées telles que des adresses IP?

RÉPONSE: je fini par faire ce qui suit - ce qui semble se reproduire un peu ce que php est fait par la norme et peut de là être modifié.

<?php 
function my_error_handler($type, $message, $file, $line, $vars) 
{ 
    switch($type) 
    { 
     case 1: // 1 // 
      $type_str = 'ERROR'; 
      break; 
     case 2: // 2 // 
      $type_str = 'WARNING'; 
      break; 
     case 4: // 4 // 
      $type_str = 'PARSE'; 
      break; 
     case 8: // 8 // 
      $type_str = 'NOTICE'; 
      break; 
     case 16: // 16 // 
      $type_str = 'CORE_ERROR'; 
      break; 
     case 32: // 32 // 
      $type_str = 'CORE_WARNING'; 
      break; 
     case 64: // 64 // 
      $type_str = 'COMPILE_ERROR'; 
      break; 
     case 128: // 128 // 
      $type_str = 'COMPILE_WARNING'; 
      break; 
     case 256: // 256 // 
      $type_str = 'USER_ERROR'; 
      break; 
     case 512: // 512 // 
      $type_str = 'USER_WARNING'; 
      break; 
     case 1024: // 1024 // 
      $type_str = 'USER_NOTICE'; 
      break; 
     case 2048: // 2048 // 
      $type_str = 'STRICT'; 
      break; 
     case 4096: // 4096 // 
      $type_str = 'RECOVERABLE_ERROR'; 
      break; 
     case 8192: // 8192 // 
      $type_str = 'DEPRECATED'; 
      break; 
     case 16384: // 16384 // 
      $type_str = 'USER_DEPRECATED'; 
      break; 
    } 


    $errormessage = '[ '.date(r).' ] '.$type_str.': '.$message.' in '.$file.' on line '.$line."\n"; 
    // for development simply ECHO $errormessage; 

     $file = 'my_errors.log'; 
     file_put_contents($file, $errormessage, FILE_APPEND); 
} 

error_reporting(E_ALL); 
ini_set('display_errors', '0'); 
set_error_handler('my_error_handler'); 

?> 
+0

Ceci est également discuté dans ce fil http://stackoverflow.com/questions/30630484/is-it-possible-to-change-php-error-log-output – Salagir

+0

Ceci est également discuté dans http: // stackoverflow .com/questions/30630484/is-it-it-to-change-php-error-log-output – Salagir

+0

Ceci est également discuté sur http: // stackoverflow.com/questions/30630484/is-it-it-it-to-change-php-error-log-output – Salagir

Répondre

3

Vous ne pouvez pas faire une personnalisation supplémentaire ou mettre en œuvre toute de cette logique avec le gestionnaire d'erreurs intégré, vous aurez besoin de définir votre propre gestionnaire d'erreurs avec set_error_handler().

Cette fonction prend un rappel qui sera invoqué lorsque PHP rencontre une erreur, et vous pouvez agir en conséquence.

Voir l'exemple sur les docs pour savoir comment utiliser cette fonction et comment implémenter un rappel approprié.

+0

Puis-je obtenir une copie de code pour le gestionnaire d'erreur standard/intégré, de sorte que je puisse aller de là et modifier le code existant? – olli

+1

Je doute que cela vous serait utile. Le gestionnaire d'erreur intégré est implémenté en C autant que je sache, car il est dans les internes de PHP. – nickb

+0

Merci pour votre aide! J'ai ajouté du code à ma question initiale pour montrer ce que j'ai fini par faire. Tous les commentaires sur comment cela peut ou ne pas fonctionner seront appréciés! – olli

Questions connexes