Bagaimana cara saya mencatat kesalahan dan peringatan ke file?

233

Bagaimana cara mengaktifkan semua kesalahan dan peringatan dan mencatatnya di file, tetapi untuk mengatur semua itu di dalam skrip (tidak mengubah apa pun di php.ini)?

Saya ingin mendefinisikan nama file dan agar semua kesalahan dan peringatan bisa masuk ke dalamnya.

Gorep
sumber

Jawaban:

358

Gunakan kode berikut:

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

Kemudian tonton file:

tail -f /tmp/php-error.log

Atau perbarui php.inisebagaimana dijelaskan dalam entri blog ini mulai 2008.

Seorang pria
sumber
41
ini_sethanya berfungsi jika kode itu dijalankan. Tidak berguna untuk kode yang memiliki kesalahan parse karena kesalahan akan terjadi sebelum kode dieksekusi. Alih-alih tulis perubahan itu ke dalam php.ini.
hakre
9
Jika Anda tidak bisa mengedit php.ini, Anda harus dapat menambahkan ini di .htaccess: php_flag log_errors on php_value error_log /home/path/public_html/domain/PHP_errors.log. Lihat perishablepress.com/...
Matthieu
1
Saya punya pertanyaan, bagaimana cara mendapatkan file error.log agar bisa dibuat di folder htdocs saya?
Tommy
Saya kira Anda baru saja mengubah folder dari tmp/php-error.loglokasi mana yang Anda inginkan?
Luke
Ini membuat crash PHP saya di 5.4.0
Supuhstar
42

Masukkan kode-kode ini di atas file PHP / index Anda:

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
sumber
4
Itu hanya jika Anda juga ingin semua kesalahan ditampilkan di output dan / atau ke browser, selain pencatatan. display_errorsharus TIDAK AKAN dinyalakan pada server produksi langsung - arahan itu khusus untuk output ke pengguna, dan tidak berpengaruh pada logging. php.net/manual/en/…
Aaron Wallentine
22

tambahkan kode ini dalam .htaccess (sebagai alternatif fungsi 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>

* seperti yang dikomentari: ini untuk server jenis Apache , dan bukan untuk Nginx atau yang lainnya.

T.Todua
sumber
7
Ini sangat spesifik berkaitan dengan modul PHP Apache.
SacredSkull
9

Itu fungsi pendek pribadi saya

# 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
sumber
6

Lihatlah log_errorsopsi konfigurasi di php.ini. Tampaknya melakukan apa yang Anda inginkan. Saya pikir Anda dapat menggunakan error_logopsi untuk mengatur file logging Anda sendiri juga.

Ketika log_errorsarahan diatur ke On, kesalahan yang dilaporkan oleh PHP akan dicatat ke log server atau file yang ditentukan error_log. Anda dapat mengatur opsi ini ini_setjuga, jika perlu.

(Harap dicatat bahwa display_errorsharus dinonaktifkan di php.ini jika opsi ini diaktifkan)

Frxstrem
sumber
1
Mengapa harus display_errorsdinonaktifkan jika Anda mengaktifkan log_errors? Tidak masuk akal menurut saya. :)
Guido Hendriks
5
Karena tidak perlu menampilkan konten kesalahan kepada publik di server produksi, terutama jika teks kesalahan sedang diam-diam login ke file.
Shabbyrobe
3
Kesalahan tampilan harus selalu dinonaktifkan pada server produksi. Tidak jika logging kesalahan dikonfigurasi ke tempat lain, tetapi selalu. Kesalahan dicatat ke log kesalahan apache secara default, itu sudah cukup.
Pihhan
1
Menampilkan kesalahan pada produksi membuat PHP lebih populer :)
PeterM
0

Selain itu, Anda memerlukan arahan "AllowOverride Options" agar ini berfungsi. (Apache 2.2.15)

Stéphane
sumber