Bagaimana cara mencetak log debug?


129

Saya ingin men-debug beberapa kode PHP, tapi saya kira mencetak log ke layar atau file tidak masalah bagi saya.

Bagaimana saya harus mencetak log dalam kode PHP?

Biasanya print/ printftampaknya pergi ke output HTML bukan konsol.

Saya memiliki server Apache yang mengeksekusi kode PHP.


Apakah skrip Anda berjalan di browser web atau di konsol (alias diurai menggunakan php.exe daripada apache / iis)?
danielrsmith

Anda harus melihat pertanyaan ini, memiliki sedikit kode logging yang berguna: stackoverflow.com/questions/5769537/…
Ben

Anda berasal dari bahasa apa? Supaya Anda php sangat berbeda dari bahasa yang dikompilasi lainnya
Ibu

1
@ Lbu: memang .. Saya tidak berharap, printfpertanyaan akan mendapatkan banyak upvotes ini ...
eugene

error_log ($ string);
Thewebus

Jawaban:


186

Trik yang kurang dikenal adalah mod_php memetakan stderr ke log Apache. Dan, ada aliran untuk itu, jadi file_put_contents('php://stderr', print_r($foo, TRUE))akan dengan baik membuang nilai $fooke dalam log kesalahan Apache.


1
+ oned untuk menyebutkan bahwa, tetapi Anda juga dapat mengatur nilai error_log ke 'php: // stdout' ketika men-debug aplikasi konsol dan membuat pesan kesalahan muncul langsung ke konsol, yaitu: error_log ("Anda mengacaukan!", 3 , "php: // stdout");
stefgosselin

4
+1 Butuh waktu terlalu lama untuk menemukan jawaban ini. Ini semua yang saya cari. Saya tidak tahu bagaimana cara melihat isi array saya (bekerja di Drupal).
Steve

Saya juga menyarankan untuk menggunakan var_export($foo, true)alih-alih print_r($foo, true)jika print_rtidak memberi Anda informasi jenis yang Anda butuhkan.
Ben

Bukankah itu sama dengan error_log (print_r ($ foo)); ?
Brunis

143
error_log(print_r($variable, TRUE)); 

semoga bermanfaat


2
Sayangnya, ini adalah solusi yang paling nyaman. Xdebug terlalu berat untuk menjalankannya sepanjang waktu. Dipilih untuk Anda
Phung D. An

26

Anda dapat menggunakan error_log untuk mengirim ke file log kesalahan server Anda (atau file opsional lainnya jika Anda mau)


21

Jika Anda menggunakan Linux:

file_put_contents('your_log_file', 'your_content');

atau

error_log ('your_content', 3, 'your_log_file');

dan kemudian di konsol

tail -f your_log_file

Ini akan menunjukkan terus menerus baris terakhir yang dimasukkan ke dalam file.


9

Anda perlu mengubah kerangka berpikir Anda. Anda menulis PHP, bukan apa pun yang Anda gunakan untuk menulis. Debugging dalam PHP tidak dilakukan di lingkungan konsol.

Di PHP, Anda memiliki 3 kategori solusi debug:

  1. Keluaran ke halaman web (lihat perpustakaan dBug untuk pandangan yang lebih baik).
  2. Menulis ke file log
  3. Dalam sesi debugging dengan xDebug

Belajarlah untuk menggunakan itu alih-alih mencoba membuat PHP berperilaku seperti bahasa lain apa pun yang Anda gunakan.


31
Sebagai orang yang menghabiskan banyak waktu menulis aplikasi konsol dan berbagai skrip non web , saya akan dengan sopan tidak setuju dengan itu.
stefgosselin

Saya benar-benar bekerja mempertahankan dan mengembangkan aplikasi konsol dan dalam penafsiran bahasa Inggris saya yang buruk tentang pertanyaan itu, saya berasumsi bahwa ia ingin men-debug aplikasi konsol. Xdebug baik-baik saja dan sangat berguna meskipun saya suka
men

1
@Stefgosselin: Netbeans melakukan hal yang hampir sama, meskipun yang terbaik yang saya lihat dengan xDebug adalah dengan Aptana.
Sylverdrag

1
Saya menggunakan xDebug di Netbeans dan berfungsi dengan baik hampir sepanjang waktu. Tapi, ada kalanya Anda perlu mencatat sesuatu di file.
cosan

coba ini juga. Anda akan bisa berbuat lebih banyak! stackoverflow.com/a/44050914/2053479
ganesh

5

Apakah Anda melakukan debug pada konsol? Ada berbagai opsi untuk debugging PHP. Fungsi yang paling umum digunakan untuk debugging cepat & kotor adalah var_dump .

Itu dikatakan dan keluar dari jalan, meskipun var_dump mengagumkan dan banyak orang melakukan semuanya hanya dengan itu, ada alat dan teknik lain yang bisa sedikit membumbui itu.

Hal-hal untuk membantu jika debugging di halaman web, bungkus <pre> </pre>tag di sekitar pernyataan dump Anda untuk memberi Anda format yang tepat pada array dan objek.

Yaitu:

<div> some html code ....
      <a href="<?php $tpl->link;?>">some link to test</a>
</div>

      dump $tpl like this:

    <pre><?php var_dump($tpl); ?></pre>

Dan, last but not least pastikan debugging penanganan kesalahan Anda diatur untuk menampilkan kesalahan. Menambahkan ini di bagian atas skrip Anda mungkin diperlukan jika Anda tidak dapat mengakses konfigurasi server untuk melakukannya.

error_reporting(E_ALL);
ini_set('display_errors', '1');

Semoga berhasil!


2

Jika Anda tidak ingin mengintegrasikan kerangka kerja seperti Zend , maka Anda dapat menggunakan metode trigger_error untuk masuk ke log kesalahan php.


2

Sederhananya adalah trigger_error:

 trigger_error("My error");

tetapi karena itu Anda tidak dapat menggunakan array atau Object

var_dump

trigger_error mungkin cara terbaik untuk menulis ke log kesalahan Anda. Anda akan berterima kasih kepada diri sendiri ketika Anda ingin mengubah ucapkan baris log dengan beberapa data khusus nanti.
Anshul

2

Anda juga dapat menulis ke file seperti ini:

$logFilePath = '../logs/debug.text';
ob_start();

// if you want to concatenate:
if (file_exists($logFilePath)) {
    include($logFilePath);
}
// for timestamp
$currentTime = date(DATE_RSS);

// echo log statement(s) here
echo "\n\n$currentTime - [log statement here]";

$logFile = fopen($logFilePath, 'w');
fwrite($logFile, ob_get_contents());
fclose($logFile);
ob_end_flush();

Pastikan izin yang tepat telah diatur sehingga php dapat mengakses dan menulis ke file ( 775).


1

Anda dapat menggunakan modul php curl untuk melakukan panggilan ke http://liveoutput.com/ . Ini berfungsi baik di lingkungan perusahaan yang aman di mana ada pembatasan tertentu dalam php.ini yang membatasi penggunaan file_put_contents.


1

Ini alat yang hebat untuk debugging & login php: PHp Debugger & Logger

Ini berfungsi langsung dari kotak dengan hanya 3 baris kode. Ia dapat mengirim pesan ke konsol js untuk debugging ajax dan dapat menggantikan penangan kesalahan. Itu juga membuang informasi tentang variabel seperti var_dump () dan print_r (), tetapi dalam format yang lebih mudah dibaca. Alat yang sangat bagus!


1

Saya telah menggunakan banyak dari ini, tetapi karena saya biasanya perlu men-debug ketika mengembangkan, dan karena saya mengembangkan di localhost, saya telah mengikuti saran orang lain dan sekarang menulis ke konsol debug JavaScript peramban (lihat http: //www.codeforest. net / debugging-php-in-browser-javascript-console ).

Itu berarti bahwa saya dapat melihat halaman web yang dihasilkan oleh PHP saya di browser saya & tekan F12 untuk dengan cepat menunjukkan / menyembunyikan jejak debug.

Karena saya terus melihat alat pengembang untuk debugger, tata letak CSS, dll, masuk akal untuk melihat loggon PHP saya di sana.

Jika ada yang memutuskan untuk memberi kita kode itu, saya membuat satu perubahan kecil. Setelah

function debug($name, $var = null, $type = LOG) {

saya tambahkan

$name = 'PHP: ' . $name;

Ini karena sisi server saya PHP menghasilkan JavaScript yang mengandung JavaScript & saya merasa berguna untuk membedakan antara output dari PHP & JS.

(Catatan: Saat ini saya memperbarui ini untuk memungkinkan saya mengaktifkan & menonaktifkan berbagai jenis output: dari PHP, dari JS, dan akses basis data)


1

Saya menggunakan cakephp jadi saya menggunakan:

$this->log(YOUR_STRING_GOES_HERE, 'debug');

0

Kamu bisa memakai:

<?php
echo '<script>console.log("debug log")</script>';
?>

2
ini memiliki banyak overhead. mengapa memohon javascript untuk output kesalahan sederhana?
clockw0rk

-8

Kamu bisa memakai

<?php
{
    AddLog("anypage.php","reason",ERR_ERROR);
}
?>

atau jika Anda ingin mencetak pernyataan itu dalam log yang dapat Anda gunakan

AddLog("anypage.php","string: ".$string,ERR_DEBUG_LOW);

8
AddLog? Ini bukan fungsi asli.
stefgosselin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.