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.

Gorep
źródło

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.

Mężczyzna
źródło
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
94

Widzieć

  • error_log - Wyślij gdzieś komunikat o błędzie

Przykład

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

Możesz dostosować obsługę błędów za pomocą własnych procedur obsługi błędów, aby wywoływały tę funkcję za każdym razem, gdy wystąpi błąd lub ostrzeżenie lub cokolwiek, co musisz zarejestrować. Aby uzyskać dodatkowe informacje, zapoznaj się z rozdziałem Obsługa błędów w podręczniku PHP

Gordon
źródło
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
Yousha Aleayoub
źródło
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.

T.Todua
źródło
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);
}
Juergen
źródło
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)

Frxstrem
źródło
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)

Stéphane
źródło