Mengelog ralat php. Log masuk PHP menggunakan Zend Log. Skrip PHP untuk mencipta fail log

Dalam setiap nyata PHP aplikasi, ralat dan pengecualian berlaku dari semasa ke semasa, amaran dan mesej muncul. Jika kita tidak menulis maklumat ini (log), maka pada satu ketika ia akan menjadi mustahil untuk memahami di mana bahagian aplikasi ralat dan pengecualian ini berlaku, dan, dengan itu, kita tidak akan dapat menyelesaikannya. Di samping itu, terdapat situasi apabila peristiwa dan tindakan log hanya perlu, seperti dalam kes pengguna log masuk dan keluar dari sistem, contohnya.

DALAM PHP sudah mempunyai kemudahan pembalakan yang diperlukan: fungsi log_ralat()– untuk menghantar mesej ke log sistem, fungsi set_error_handler(), untuk memintas amaran dan ralat. Fungsi ini boleh digunakan untuk pengurusan ralat tersuai, memberikan pembangun kod keupayaan untuk mengawal secara bebas pengendalian ralat dan logik penapisan.

Walau bagaimanapun, capaian peringkat rendah sedemikian mengakibatkan pertindihan kod yang kerap, dan yang lebih penting, kod tersebut lebih terdedah kepada ralat. Oleh itu, komponen siap sedia, diuji dengan baik dan terbukti dalam keadaan "pertempuran", datang untuk membantu pengaturcara.

Komponen tersebut termasuk komponen log zend daripada Rangka kerja Zend. Komponen zend-log boleh digunakan sebagai komponen pembalakan pelbagai guna, sejenis bicu semua dagangan. Ia menyokong banyak format mesej log dan jenis pangkalan data pengelogan (fail, pangkalan data), serta mempunyai sistem penapisan mesej yang canggih dan banyak lagi. Juga zend-log bersesuaian dengan PSR-3 piawaian pembalakan. Dipasang seperti ini:

Komposer memerlukan zendframework/zend-log

Ia digunakan seperti berikut (contohnya, fail index.php dalam akar projek digunakan):

Memerlukan "vendor/autoload.php";

Gunakan Zend\Log\Logger;
gunakan Zend\Log\Writer\Stream;

$logger = Logger baharu;

// hantar ralat ke konsol
$writer = new Stream("php://ouput");

$logger -> addWriter($writer);
$logger -> log(Logger::INFO,"Sesetengah maklumat");

Hasil daripada menjalankan kod di atas:

26-09-2017T10:40:34+03:00 INFO(6): Beberapa maklumat

Baris ringkasan termasuk masa acara, keutamaan dan mesej. Format mesej output sudah tentu boleh diubah, jika perlu, menggunakan kaedah tersebut setFormatter(). Secara lalai, baris log diterangkan oleh templat berikut:

%timestamp% %priorityName% (%priority%): %message% %extra%

  1. %timestamp% ialah cap masa
  2. %priorityName% - label teks keutamaan
  3. %priority% - label keutamaan angka
  4. %message% - mesej
  5. %extra% - nilai pilihan untuk maklumat tambahan

Jika anda ingin menukar format mesej, lakukan ini seperti berikut:

$formatter = new Zend\Log\Formatter\Simple("message %message%" . PHP_EOL);
$writer -> setFormatter($formatter);

Komponen zend-log juga boleh digunakan untuk log ralat dan pengecualian daripada penterjemah PHP itu sendiri. Untuk melakukan ini, terdapat dua kaedah statik dalam kelas Logger: Logger::registerErrorHandler($logger)– untuk memintas ralat dan Logger::registerExceptionHandler($logger)- untuk menangkap pengecualian.

Gunakan Zend\Log\Logger;
gunakan Zend\Log\Writer;

$logger = Logger baharu;
$writer = new Writer\Stream(__DIR__ . "/test.log");
$logger->addWriter($writer);

// Ralat log
Logger::registerErrorHandler($logger);

// Pengecualian log
Logger::registerExceptionHandler($logger);

Seperti yang dinyatakan sebelum ini, zend-log memberikan kami keupayaan untuk menapis mesej untuk pengelogan, i.e. Sebelum menulis mesej ke log, kami boleh melihat sama ada ia memenuhi kriteria kami, dan jika ya, kami menulisnya.

Berikut ialah contoh:

$filter = Zend\Log\Filter\Priority baharu(Logger::CRIT);

// kaedah addFilter antara muka Penulis
$writer->addFilter($filter);

Dalam contoh ini, kami hanya akan log mesej yang keutamaannya kurang daripada atau sama dengan kritikal ( Logger::CRIT).

Senarai lengkap keutamaan yang ditakrifkan dalam kelas Zend\Log\Logger:

Const EMERG = 0; // Penggera: sistem tidak boleh digunakan
const ALERT = 1; // Penggera: tindakan segera perlu diambil
const CRIT = 2; // Situasi kritikal
const ERR = 3; // Ralat
const AMARAN = 4; // Amaran
const NOTIS = 5; // Perhatian
const INFO = 6; // Maklumat
const DEBUG = 7; // Nyahpepijat, nyahpepijat

Kami juga boleh menapis mesej berdasarkan ungkapan biasa, cap masa, dsb. Oleh itu, log masuk PHP- ini adalah perkara yang penting dan kadangkala perlu semasa membangun aplikasi web.

Kebanyakan semua soalan di tapak bermula dengan "Bantuan, ia tidak berfungsi, ia tidak akan bermula...". Semua jawapan datang kepada petua dan nasihat, tetapi itulah sebabnya saya tidak terfikir untuk menulis artikel tentang bagaimana dan di mana untuk mencari ralat atau tentang menggunakan log, saya tidak tahu. Oleh itu, kami mengisi jurang dan menasihatkan semua orang untuk membaca artikel ini.

Log (balak) - (Bahasa Inggeris) log, anda mungkin pernah menjumpai fail sebelum ini *.log) sebagai peraturan, fail teks di mana terdapat senarai peristiwa, log peristiwa, diari, rekod, protokol, dsb., dalam susunan kronologi. Log dicipta oleh pelbagai program, perkhidmatan dan sistem pengendalian. Setiap program boleh mempunyai log sendiri (fail teks).

Apabila membangunkan tapak web, log yang dibuat akan menjadi berharga untuk pembangun web:
1. log tahap sistem pengendalian:
- Komputer Saya - Panel Kawalan - Alat Pentadbiran - Pemapar Acara
- Komputer saya - Jalankan - "eventvwr.msc"


Ini termasuk rekod semua peristiwa dalam sistem pengendalian Windows. Termasuk di sini, pada tab:
- Pandangan Tersuai / Acara Pentadbiran
- Log Windows/Sistem

Anda boleh mencari log yang berkaitan dengan perkhidmatan Apache (jika pelayan web Apache berjalan sebagai perkhidmatan) dan ralat lain yang disebabkan, contohnya, oleh sambungan php. Pada umumnya, semua ralat Windows dimasukkan di sini. Apache, sebagai perkhidmatan, dianggap sebagai sebahagian daripada Windows, jadi jika sebarang ralat berlaku semasa memulakan perkhidmatan Apache, anda perlu mencari penjelasan ralat ini di sini. Seterusnya, jika penyahkodan ralat dalam log tidak membenarkan anda memahami masalah sebenar, salin bahagian utama log ke dalam Google dan cari masalah yang serupa. Kemungkinan besar anda akan menemui jawapan yang akan membantu anda. Apabila memulakan sebarang permainan, program, perkhidmatan, apabila ralat berlaku, entri baharu muncul dalam log dengan penerangan yang lebih terperinci tentang ralat. Berdasarkan ini, anda sentiasa boleh mencari jawapan di Internet.

2. Log peringkat Apache:
Selain log Windows, Apache sendiri mencipta log sendiri dalam bentuk fail teks. Apabila memasang dan mengkonfigurasi pelayan web Apache dalam fail httpd.conf terdapat baris: ErrorLog "C:/apache/error.log" di mana, "C:/apache/error.log" ialah laluan ke fail log pelayan web Apache. Tetapkan laluan anda atau ingat sahaja, jika ralat berlaku semasa memulakan Apache, anda perlu membuka fail ini dan mencari entri terkini, yang akan mencerminkan punca ralat. Selain itu, pelayan web Apache membolehkan anda membuat log secara berasingan untuk setiap hos maya. Contoh hos maya dalam fail conf/extra/httpd-vhosts.conf:


DocumentRoot "C:/apache/symfony/www/web"
Simfoni Nama Pelayan
ServerAlias ​​www.symfony
ErrorLog "C:/apache/symfony/error.log"
CustomLog "C:/apache/symfony/access.log" biasa


DocumentRoot "C:/apache/phpmyadmin"
Nama Pelayan phpmyadmin
ServerAlias ​​www.phpmyadmin
ErrorLog "C:/apache/phpmyadmin/error.log"
CustomLog "C:/apache/phpmyadmin/access.log" biasa

3. log peringkat php:
apabila menetapkan konfigurasi php dalam fail php.ini, untuk mengkonfigurasi paparan log, kami dapati baris berikut:

error_reporting = E_ALL & ˜E_NOTICE & ˜E_STRICT //jenis dan jenis ralat yang dipaparkan dilog
log_errors = Hidup //hidupkan pembalakan
log_errors_max_len = 1024 // tentukan saiz maksimum fail log (1024 bait)
error_log = php_errors.log //nyatakan nama fail di mana log akan disimpan, fail ini akan dibuat dalam akar hos maya anda. Fail berasingan akan dibuat untuk setiap hos.

Selain fakta bahawa semua ralat PHP akan direkodkan dalam fail, anda juga boleh membuat log semasa pelaksanaan skrip PHP menggunakan fungsi error_log. Ini boleh berguna jika anda secara aktif menggunakan try ... catch dalam kod anda, dalam hal ini skrip tidak akan ditamatkan sekiranya berlaku ralat kritikal, dan semua ralat yang tidak dijangka akan sentiasa dicatatkan dalam log.

cuba (
$r = 5/0;
) tangkapan (Pengecualian $exc) (
error_log($exc->getMessage());
}

Berdasarkan hasil pelaksanaan kod ini, fail log php_errors.log baris yang serupa dengan ini akan dimasukkan:

Amaran PHP: Pembahagian dengan sifar dalam C:\apache\test\www\index.php pada baris 5

Itu sahaja, gunakan log di mana mungkin, dan anda akan segera menemui ralat dalam kod dan sebab pemprosesan data yang salah.

483

Log masuk PHP bermakna apakah jenis ralat aplikasi web/tapak/skrip php anda akan melaporkan kepada anda dan bagaimana.

Terdapat 2 (3) cara utama untuk menerima ralat daripada aplikasi:

  1. Memaparkan ralat ini terus pada skrin
  2. Log ralat ini ke fail log khas
  3. atau kedua-dua pilihan serentak: memaparkan ralat ini pada skrin dan merekodkannya dalam fail log khas

Sebagai peraturan, diamalkan bahawa semasa pembangunan (dalam persekitaran tempatan) semua ralat ditunjukkan secara langsung pada skrin, supaya ia lebih mudah dan lebih cepat untuk ditangkap dan diperbetulkan, tetapi dalam persekitaran pengeluaran (dalam pengeluaran) ralat tidak ditunjukkan sama sekali (kerana untuk pengguna adalah maklumat yang tidak berguna) dan semua maklumat tentang mereka ditulis ke fail log, yang selalu disemak oleh pembangun.

Tetapan untuk pengelogan ralat

  1. error_reporting- ini adalah parameter yang paling penting. Ia bertanggungjawab untuk jenis mesej ralat yang akan dipaparkan/ditulis pada fail log. Saya percaya terdapat hanya 2 pilihan di sini yang boleh digunakan:
    • -1 (atau E_ALL) - semua jenis ralat dilaporkan;
    • 0 - tiada jenis ralat dilaporkan

    Saya mengesyorkan menggunakan -1 (atau E_ALL) secara eksklusif.
    Kerana aplikasi tidak sepatutnya mempunyai sebarang ralat, pada dasarnya. Pilihan ini boleh ditetapkan melalui fail konfigurasi dalam php.ini atau terus dalam skrip php dengan memanggil fungsi error_reporting:

    Ralat_laporan(-1); error_reporting(E_ALL);

    By the way, ini adalah satu-satunya pilihan yang tersedia dalam bahasa PHP sebagai fungsi. Semua pilihan lain boleh ditetapkan secara eksklusif dengan mengedit fail konfigurasi php.ini atau memanggil fungsi ini_set() menghantar ke dalamnya, masing-masing, parameter yang diperlukan dan nilai untuknya.

  2. paparan_ralat— parameter ini bertanggungjawab untuk memaparkan terus ralat pada skrin selepas ia benar-benar berlaku. Parameter ini boleh mempunyai nilai 0 atau 1 atau Hidup / Mati. Itu. sama ada menunjukkan ralat pada skrin atau tidak.
  3. display_startup_errors- pilihan ini bertanggungjawab untuk memaparkan ralat yang berlaku selepas PHP dilancarkan. Sebagai contoh, jika terdapat ralat sintaks dalam fail konfigurasi, maklumat mengenainya akan ditunjukkan. Parameter ini boleh mempunyai nilai 0 atau 1 atau Hidup / Mati.
  4. log_errors— arahan ini bertanggungjawab untuk menulis mesej ralat ke fail log. Parameter ini boleh mempunyai nilai 0 atau 1 atau Hidup / Mati. Itu. kesilapan log atau tidak.
  5. log_ralat— tetapan ini bertanggungjawab untuk laluan ke fail (fail log) di mana semua ralat aplikasi yang berlaku akan direkodkan
  6. html_errors— pilihan yang sama bertanggungjawab untuk format untuk memaparkan ralat aplikasi. Jika ditetapkan kepada 1 atau Hidup, ralat akan ditunjukkan menggunakan HTML, i.e. akan ada jejak asal-usul kesilapan dan semuanya akan menjadi agak bermaklumat dan berwarna-warni. Jika tetapan ini ditetapkan kepada 0 atau Mati, ralat akan dipaparkan dalam teks biasa pada sebilangan kecil baris.

1. Tetapan untuk memaparkan ralat pada skrin




ini_set("html_errors", 1);
ini_set("log_errors", 0);

2. Tetapan untuk merekod ralat dalam fail log

Ralat_laporan(-1); // ini_set("error_reporting", -1);
ini_set("display_errors", 0);
ini_set("display_startup_errors", 0);
ini_set("log_errors", 1);

3. Tetapan untuk memaparkan ralat secara serentak dan merekodkannya dalam fail log

Ralat_laporan(-1); // ini_set("error_reporting", -1);
ini_set("display_errors", 1);
ini_set("display_startup_errors", 1);
ini_set("log_errors", 1);
ini_set("html_errors", 1);
ini_set("error_log", "/var/log/php/error.log");

Selain itu, pilihan ini boleh ditetapkan dalam fail konfigurasi php.ini atau dalam fail hos maya anda.

Terdapat sejumlah besar perkhidmatan di Internet yang menyediakan perkhidmatan untuk menjejak trafik ke tapak web anda. Perkhidmatan ini disediakan dengan bayaran dan percuma. Sebagai contoh, kita boleh memetik LiveInternet. Perkhidmatan ini agak meluas di Internet dan hampir setiap laman web menggunakan perkhidmatannya. Pemilik mempunyai statistik terperinci tentang lawatan ke tapaknya.

Tanpa ragu ragu! Perkhidmatan ini amat diperlukan dalam merekod trafik laman web dan mengkaji lebih lanjut tingkah laku pengguna. Tetapi dalam artikel ini saya ingin memberitahu anda bagaimana anda boleh membuat fail log lawatan pelawat pada pelayan.

Lawati fail log

Fail log ini akan sangat berguna untuk merekodkan lawatan dan paparan tapak web anda oleh pelawat. Untuk membuat fail log, skrip yang ditulis dalam PHP digunakan. Skripnya agak mudah difahami dan dipasang di tapak.

Skrip PHP untuk mencipta fail log

Skrip merekodkan masa yang tepat untuk masuk ke tapak, menentukan penyemak imbas pelawat, dan yang paling penting, menentukan dari mana pelawat datang kepada anda. Fail log direkodkan setiap kali halaman tertentu tapak dipaparkan. Iaitu, pemilik tapak boleh melihat dalam fail log halaman tertentu tapak itu dilihat oleh pelawat pada IP dan masa tertentu, menggunakan penyemak imbas tertentu.

Penyenaraian skrip untuk menulis data ke fail log

Memasang skrip

Simpan skrip dalam templat atau dalam fail luaran users.php. Untuk memasukkan skrip ke dalam halaman, gunakan kod berikut.

Pada tapak web yang serius, pelik untuk melihat ralat dipaparkan kepada pengguna dalam penyemak imbas di tempat yang paling tidak dijangka. Sebab mereka muncul ialah perbualan yang berasingan. Tetapi mengapa ia dipaparkan? Lagipun, teks ralat adalah maklumat untuk penyahpepijatan dan ditujukan untuk pembangun, bukan klien.

Di samping itu, maklumat proprietari inilah yang biasanya membantu penggodam jahat memecahkan tapak tersebut. Contoh klasik ialah pilihan untuk memaparkan pertanyaan apabila terdapat ralat: "anda mempunyai ralat dalam pertanyaan berhampiran WHERE id= " ... Terima kasih banyak. Selepas "WHERE id=..." kami menggantikan rentetan "0 OR 1>0" dan pertanyaan dilaksanakan di seluruh jadual. Jika permintaan adalah untuk pemadaman, maka...anda tahu, ia menyeronokkan =). Itulah sebabnya saya sentiasa menyertakan pembolehubah dalam petikan dalam petikan. Untuk berjaga-jaga...

Tetapi saya terbawa-bawa. Bukan itu yang kita bincangkan hari ini. Hari ini kita akan bercakap tentang cara mengelak daripada memaparkan ralat kepada pelanggan, sambil menyimpan semua mesej kepada juruweb sebagai kenang-kenangan.

Mari kita mulakan dengan gambaran ringkas tentang jenis ralat dalam PHP.

Jadual 1. Penerangan tentang ralat dalam PHP4(senarai asal)
angka
maksudnya
berterusan Penerangan Boleh ditangkap/tidak
1 E_ERROR Kesilapan maut. Contohnya, ralat semasa mengakses memori. Perlaksanaan skrip terganggu. Tidak
2 E_AMARAN Amaran (bukan kesilapan yang membawa maut). Pelaksanaan skrip tidak terganggu. ya
4 E_PARSE Ralat semasa penghuraian sintaks. Dihasilkan oleh penghurai. Tidak
8 E_NOTIS Nota (ralat kurang serius daripada amaran). Nyatakan situasi yang boleh menyebabkan ralat yang lebih serius, tetapi juga boleh berlaku semasa operasi skrip biasa. ya
16 E_CORE_ERROR Ralat semasa memuat turun PHP. Analogi dengan E_ERROR, yang dihasilkan oleh kernel PHP. Tidak
32 E_CORE_WARNING Amaran semasa memuatkan PHP Sama seperti E_WARNING, yang dihasilkan oleh kernel PHP. Tidak
64 E_COMPILE_ERROR Ralat maut semasa penyusunan kod. Analog E_ERROR, yang dihasilkan oleh enjin Zend. Tidak
128 E_COMPILE_AMARAN Amaran semasa penyusunan kod. Analog E_WARNING, yang dihasilkan oleh enjin Zend. Tidak
256 E_USER_ERROR Ralat pengguna. ya
512 E_USER_AMARAN Amaran pengguna. ya
1024 E_USER_NOTICE Nota Pengguna ya

Kami berminat dengan ralat yang boleh kami pintas. Ini termasuk: E_WARNING, E_NOTICE dan E_USER_*. Jenis ralat lain tidak boleh dipintas sama ada kerana ia berlaku sebelum kernel PHP itu sendiri selesai dimuatkan, atau kerana ia berlaku pada peringkat menghurai dan menyusun kod PHP, jadi outputnya hanya perlu dimatikan:

ini_set("display_errors",0);

Tetapi saya menganggap bahawa skrip kami cukup nyahpepijat sehingga ia tidak mengandungi ralat sintaks asas, jadi kami tidak sepatutnya kehilangan apa-apa.

Kadar ralat lalai dalam PHP ialah E_ALL & ~E_NOTICE (atau 2039 dalam bentuk angka), yang bermaksud kami mengabaikan komen tetapi melaporkan semua ralat lain.

Oleh itu, mari tukar tahap output ralat kepada E_ALL:

error_reporting(E_ALL);

Sekarang mari kita takrifkan semula pengendali ralat dan gantikan fungsi kita, yang kini akan mengendalikan pengendalian ralat:

set_error_handler("log_pengguna");

Mari kita lihat lebih dekat fungsi ini. Ia diluluskan 5 parameter:

  • kod salah
  • teks ralat
  • nama fail tempat ralat berlaku
  • baris dalam fail
  • tatasusunan berubah-ubah

Fungsi ini tidak diperlukan untuk mengembalikan apa-apa. Memandangkan kita akan melihat log ralat kemudian, kita perlu merekodkan log itu, sebagai contoh, dalam fail supaya mudah untuk kita bekerja dengannya kemudian.

=(LOG_FILE_MAXSIZE*1024)) ( //semak tetapan, jika log_rotate ditetapkan, //kemudian “anjakan” fail lama ke bawah satu dan buat log kosong //jika tidak, kosongkan dan tulis bukannya log lama jika ( LOG_ROTATE===true ) ( $i=1; //kira log lama dalam direktori manakala (is_file(LOG_FILE_NAME.".".$i)) ($i++; ) $i--; //untuk setiap daripadanya seterusnya kita menambah nombor sebanyak 1 manakala ($i>0) ( namakan semula(LOG_FILE_NAME."..".$i,LOG_FILE_NAME. "." .(1+$i--)); ) namakan semula (LOG_FILE_NAME,LOG_FILE_NAME. .".1"); sentuh (LOG_FILE_NAME); ) elseif(is_file(LOG_FILE_NAME)) ( //jika kami menulis log dari atas, kami akan memadam //dan mencipta fail kosong sekali lagi nyahpaut(LOG_FILE_NAME); sentuh(LOG_FILE_NAME) ; ) ) /* semak sama ada fail sedemikian wujud jika tidak - bolehkah kita menciptanya jika wujud - bolehkah kita menulis kepadanya */ if(!is_file(LOG_FILE_NAME)) ( if (!touch(LOG_FILE_NAME)) ( return "can \"t create log file"; ) ) elseif( !is_writable(LOG_FILE_NAME)) ( return "can\"t write to log files"; ) //beri perhatian kepada fungsi yang kami gunakan untuk menulis fail log. error_log($err_str, 3, LOG_FILE_NAME); ) ?>

Sudah tentu, mungkin untuk menggunakan storan yang lebih logik untuk tujuan sedemikian - pangkalan data, tetapi ralat, sebahagian besarnya, timbul dengan tepat apabila bekerja dengan pangkalan data, jadi saya tidak akan bergantung padanya.

Sebenarnya, itu sahaja. Selebihnya, saya fikir, tidak akan sukar untuk anda, terutamanya jika anda menggunakan fail (); &meletup(); . Dan jika ia berlaku, maka anda boleh menggunakan [kod ini].

Menjangkakan soalan "mengapa saya tidak menggunakan CSV, yang kelihatan logik untuk digunakan dalam situasi ini?", Saya menjawab: mesej ralat mungkin mengandungi bilangan aksara perkhidmatan yang tidak diketahui (aka koma dan koma bertitik), yang jelas akan merumitkan penghuraian CSV. Dan saya tidak akan melihat log dalam Excel.

Pemikiran lain mengenai topik ini:

  • apabila log gz menjadi lapuk, ip fail dan letakkan dalam arkib;
  • sama, tetapi dengan bungkusan dihantar ke pejabat pos;
  • jika ralat kritikal berlaku, hantar e-mel (lihat contoh dari manual untuk fungsi