Comment enregistrer des erreurs et des avertissements dans un fichier?

233

Comment activer toutes les erreurs et tous les avertissements et les enregistrer dans un fichier, mais pour configurer tout cela dans le script (sans rien changer dans php.ini)?

Je veux définir un nom de fichier et que toutes les erreurs et avertissements y soient connectés.

Gorep
la source

Réponses:

358

Utilisez le code suivant:

ini_set("log_errors", 1);
ini_set("error_log", "/tmp/php-error.log");
error_log( "Hello, errors!" );

Regardez ensuite le fichier:

tail -f /tmp/php-error.log

Ou mettez php.inià jour comme décrit dans cette entrée de blog de 2008.

Un homme
la source
41
ini_setne fonctionne que si ce code est exécuté. Inutile pour le code comportant des erreurs d'analyse car l'erreur se produira avant l'exécution du code. Au lieu de cela, écrivez ces changements dans le php.ini.
hakre
9
Si vous ne pouvez pas modifier php.ini, vous devriez être en mesure d'ajouter ceci dans le .htaccess: php_flag log_errors on php_value error_log /home/path/public_html/domain/PHP_errors.log. Voir perishablepress.com/…
Matthieu
1
J'ai une question, comment obtenir le fichier error.log à créer à la place dans mon dossier htdocs?
Tommy
Je suppose que vous changez simplement le dossier à partir tmp/php-error.logde quel emplacement vous souhaitez?
Luke
Cela bloque mon PHP en 5.4.0
Supuhstar
94

Voir

  • error_log - Envoyer un message d'erreur quelque part

Exemple

error_log("You messed up!", 3, "/var/tmp/my-errors.log");

Vous pouvez personnaliser la gestion des erreurs avec vos propres gestionnaires d'erreurs pour appeler cette fonction pour vous chaque fois qu'une erreur ou un avertissement ou tout ce dont vous avez besoin pour vous connecter se produit. Pour plus d'informations, veuillez vous référer au chapitre Gestion des erreurs dans le manuel PHP

Gordon
la source
42

Mettez simplement ces codes en haut de votre fichier PHP / index:

error_reporting(E_ALL); // Error/Exception engine, always use E_ALL

ini_set('ignore_repeated_errors', TRUE); // always use TRUE

ini_set('display_errors', FALSE); // Error/Exception display, use FALSE only in production environment or real server. Use TRUE in development environment

ini_set('log_errors', TRUE); // Error/Exception file logging engine.
ini_set('error_log', 'your/path/to/errors.log'); // Logging file path
Yousha Aleayoub
la source
4
C'est seulement si vous souhaitez également que toutes les erreurs soient affichées dans la sortie et / ou dans le navigateur, en plus de la journalisation. display_errorsne doit JAMAIS être activé sur un serveur de production en direct - cette directive est spécifiquement destinée à la sortie vers l'utilisateur et n'a aucun effet sur la journalisation. php.net/manual/en/…
Aaron Wallentine
22

ajoutez ce code dans .htaccess (comme alternative à la fonction php.ini / ini_set ):

<IfModule mod_php5.c>
php_flag log_errors on 
php_value error_log ./path_to_MY_PHP_ERRORS.log
# php_flag display_errors on 
</IfModule>

* comme commenté: c'est pour les serveurs de type Apache , et non pour Nginx ou autres.

T.Todua
la source
7
Ceci est cependant très spécifiquement lié au module PHP d'Apache.
SacredSkull
9

C'est ma courte fonction personnelle

# logging
/*
[2017-03-20 3:35:43] [INFO] [file.php] Here we are
[2017-03-20 3:35:43] [ERROR] [file.php] Not good
[2017-03-20 3:35:43] [DEBUG] [file.php] Regex empty

mylog ('hallo') -> INFO
mylog ('fail', 'e') -> ERROR
mylog ('next', 'd') -> DEBUG
mylog ('next', 'd', 'debug.log') -> DEBUG file debug.log
*/
function mylog($text, $level='i', $file='logs') {
    switch (strtolower($level)) {
        case 'e':
        case 'error':
            $level='ERROR';
            break;
        case 'i':
        case 'info':
            $level='INFO';
            break;
        case 'd':
        case 'debug':
            $level='DEBUG';
            break;
        default:
            $level='INFO';
    }
    error_log(date("[Y-m-d H:i:s]")."\t[".$level."]\t[".basename(__FILE__)."]\t".$text."\n", 3, $file);
}
Juergen
la source
6

Jetez un oeil à l' log_errorsoption de configuration dans php.ini. Il semble faire exactement ce que vous voulez. Je pense que vous pouvez également utiliser l' error_logoption pour définir votre propre fichier de journalisation.

Lorsque la log_errorsdirective est définie sur On, toutes les erreurs signalées par PHP sont enregistrées dans le journal du serveur ou dans le fichier spécifié avec error_log. Vous pouvez également définir ces options avec ini_set, si vous en avez besoin.

(Veuillez noter que display_errorsdevrait être désactivé dans php.ini si cette option est activée)

Frxstrem
la source
1
Pourquoi devrait display_errorsêtre désactivé si vous activez log_errors? Ça n'a pas de sens à mon avis. :)
Guido Hendriks
5
Parce qu'il n'est pas nécessaire de publier le contenu des erreurs au public sur un serveur de production, surtout si le texte de l'erreur est discrètement enregistré dans un fichier.
Shabbyrobe
3
Les erreurs d'affichage doivent toujours être désactivées sur le serveur de production. Pas si la journalisation des erreurs est configurée ailleurs, mais toujours. Les erreurs sont enregistrées par défaut dans le journal des erreurs Apache, ce qui est souvent suffisant.
Pihhan
1
L'affichage d'erreurs sur la production rend PHP plus populaire :)
PeterM
0

De plus, vous avez besoin de la directive "AllowOverride Options" pour que cela fonctionne. (Apache 2.2.15)

Stéphane
la source