Jak zalogować się w pliku do błędów i ostrzeżeń?


233

Jak włączyć wszystkie błędy i ostrzeżenia i zalogować je do pliku, ale aby skonfigurować to wszystko w skrypcie (nie zmieniając niczego w php.ini)?

Chcę zdefiniować nazwę pliku, aby wszystkie błędy i ostrzeżenia były w nim rejestrowane.

Odpowiedzi:


358

Użyj następującego kodu:

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

Następnie obejrzyj plik:

tail -f /tmp/php-error.log

Lub zaktualizuj php.inizgodnie z opisem w tym wpisie na blogu z 2008 roku.


41
ini_setdziała tylko wtedy, gdy ten kod jest wykonywany. Nie jest użyteczny w przypadku kodu, który zawiera błędy analizy, ponieważ błąd wystąpi przed wykonaniem kodu. Zamiast tego zapisz te zmiany w php.ini.
hakre 16.04.13

9
Jeśli nie można edytować php.ini, powinieneś być w stanie dodać to w .htaccess: php_flag log_errors on php_value error_log /home/path/public_html/domain/PHP_errors.log. Zobacz perishablepress.com/…
Matthieu

1
Mam pytanie, jak uzyskać plik error.log, aby zamiast tego utworzyć go w folderze htdocs?
Tommy

Wydaje mi się, że po prostu zmieniłeś folder, z tmp/php-error.logktórego chcesz wybrać lokalizację?
Łukasz

To powoduje awarię mojego PHP w wersji 5.4.0
Supuhstar


42

Po prostu umieść te kody na górze pliku PHP / indeksu:

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

4
Dzieje się tak tylko wtedy, gdy oprócz rejestrowania chcesz także wyświetlać wszystkie błędy w danych wyjściowych i / lub przeglądarce . NIGDY nie powinien być włączony na działającym serwerze produkcyjnym - ta dyrektywa dotyczy danych wyjściowych użytkownika i nie ma wpływu na rejestrowanie. php.net/manual/en/…display_errors
Aaron Wallentine

22

dodaj ten kod do .htaccess (jako alternatywa dla funkcji 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>

* jak skomentowano: dotyczy to serwerów typu Apache , a nie Nginx i innych.


7
Jest to jednak szczególnie związane z modułem PHP Apache.
SacredSkull

9

To moja osobista krótka funkcja

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

6

Spójrz na log_errorsopcję konfiguracji w php.ini. Wydaje się, że robi to, co chcesz. Myślę, że możesz użyć error_logopcji, aby ustawić własny plik rejestrowania.

Gdy log_errorsdyrektywa jest ustawiona na On, wszelkie błędy zgłaszane przez PHP będą rejestrowane w dzienniku serwera lub w pliku określonym za pomocą error_log. W ini_setrazie potrzeby możesz ustawić te opcje również.

(Pamiętaj, że display_errorsnależy wyłączyć w php.ini, jeśli ta opcja jest włączona)


1
Dlaczego należy display_errorswyłączyć, jeśli włączysz log_errors? Moim zdaniem nie ma to sensu. :)
Guido Hendriks,

5
Ponieważ nie ma potrzeby publikowania treści błędów publicznie na serwerze produkcyjnym, szczególnie jeśli tekst błędu jest dyskretnie logowany do pliku.
Shabbyrobe,

3
Błędy wyświetlania powinny być zawsze wyłączone na serwerze produkcyjnym. Nie, jeśli rejestrowanie błędów jest skonfigurowane w innym miejscu, ale zawsze. Błędy są domyślnie rejestrowane w dzienniku błędów apache, co często wystarcza.
Pihhan

1
Wyświetlanie błędów w produkcji sprawia, że ​​PHP jest bardziej popularne :)
PeterM

0

Ponadto do działania niezbędna jest dyrektywa „AllowOverride Options”. (Apache 2.2.15)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.