Wie protokolliere ich Fehler und Warnungen in einer Datei?

233

Wie schalte ich alle Fehler und Warnungen ein und protokolliere sie in einer Datei, aber um all das im Skript einzurichten (ohne etwas in der php.ini zu ändern)?

Ich möchte einen Dateinamen definieren, damit alle Fehler und Warnungen darin angemeldet werden.

Gorep
quelle

Antworten:

358

Verwenden Sie den folgenden Code:

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

Dann schauen Sie sich die Datei an:

tail -f /tmp/php-error.log

Oder aktualisieren Sie php.iniwie in diesem Blogeintrag von 2008 beschrieben.

Ein Mann
quelle
41
ini_setfunktioniert nur, wenn dieser Code ausgeführt wird. Nicht nützlich für Code mit Analysefehlern, da der Fehler vor der Ausführung des Codes auftritt. Schreiben Sie diese Änderungen stattdessen in die php.ini.
hakre
9
Wenn Sie php.ini nicht bearbeiten können, sollten Sie dies in der .htaccess hinzufügen können : php_flag log_errors on php_value error_log /home/path/public_html/domain/PHP_errors.log. Siehe perishablepress.com/...
Matthieu
1
Ich habe eine Frage, wie ich die Datei error.log in meinem Ordner htdocs erstellen kann.
Tommy
Ich denke, Sie ändern einfach den Ordner von tmp/php-error.logdem gewünschten Ort?
Luke
Dies stürzt mein PHP in 5.4.0
Supuhstar
42

Fügen Sie einfach diese Codes oben in Ihre PHP / Index-Datei ein:

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
quelle
4
Dies ist nur möglich, wenn zusätzlich zur Protokollierung auch alle Fehler in der Ausgabe und / oder im Browser angezeigt werden sollen . sollte NIEMALS auf einem Live-Produktionsserver aktiviert werden - diese Anweisung ist speziell für die Ausgabe an den Benutzer vorgesehen und hat keine Auswirkungen auf die Protokollierung. php.net/manual/en/…display_errors
Aaron Wallentine
22

Fügen Sie diesen Code in .htaccess hinzu (als Alternative zur Funktion 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>

* wie kommentiert: Dies gilt für Server vom Apache- Typ und nicht für Nginx oder andere.

T.Todua
quelle
7
Dies betrifft jedoch ganz speziell das PHP-Modul von Apache.
SacredSkull
9

Das ist meine persönliche Kurzfunktion

# 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);
}
Jürgen
quelle
6

Schauen Sie sich die log_errorsKonfigurationsoption in der php.ini an. Es scheint genau das zu tun, was Sie wollen. Ich denke, Sie können die error_logOption auch verwenden, um Ihre eigene Protokolldatei festzulegen.

Wenn die log_errorsDirektive auf gesetzt ist On, werden alle von PHP gemeldeten Fehler im Serverprotokoll oder in der mit angegebenen Datei protokolliert error_log. Sie können diese Optionen bei ini_setBedarf auch mit einstellen .

(Bitte beachten Sie, dass display_errorsdies in der php.ini deaktiviert sein sollte, wenn diese Option aktiviert ist.)

Frxstrem
quelle
1
Warum sollte display_errorsdeaktiviert werden, wenn Sie aktivieren log_errors? Macht meiner Meinung nach keinen Sinn. :)
Guido Hendriks
5
Weil es nicht erforderlich ist, den Inhalt der Fehler auf einem Produktionsserver an die Öffentlichkeit auszugeben, insbesondere wenn der Text des Fehlers diskret in einer Datei protokolliert wird.
Shabbyrobe
3
Anzeigefehler sollten auf dem Produktionsserver immer deaktiviert sein. Nicht wenn die Fehlerprotokollierung an einer anderen Stelle konfiguriert ist, sondern immer. Fehler werden standardmäßig im Apache-Fehlerprotokoll protokolliert, das ist oft genug.
Pihhan
1
Das Anzeigen von Fehlern in der Produktion macht PHP populärer :)
PeterM
0

Außerdem benötigen Sie die Anweisung "AllowOverride Options", damit dies funktioniert. (Apache 2.2.15)

Stéphane
quelle