Bir hata ayıklama günlüğü nasıl yazdırılır?


129

Bazı PHP kodlarında hata ayıklamak istiyorum ama sanırım ekrana veya dosyaya bir günlük yazdırmak benim için sorun değil.

PHP kodundaki bir logu nasıl yazdırmalıyım?

Normal print/ printfkonsola değil HTML çıktısına gidiyor gibi görünüyor.

PHP kodunu çalıştıran Apache sunucum var.


Komut dosyanız bir web tarayıcısında mı yoksa bir konsolda mı çalışıyor (aka apache / iis yerine php.exe kullanılarak ayrıştırılıyor)?
danielrsmith

Bu soruya bakmalısınız, yararlı bir günlük kaydı kodu var: stackoverflow.com/questions/5769537/…
Ben

hangi dilden geliyorsun Sırf
php'nin

1
@lbu: gerçekten .. Beklemiyordum, printfsoru bu kadar olumlu oy alacaktı ...
eugene

error_log ($ string);
Thewebus

Yanıtlar:


186

Daha az bilinen bir numara, mod_php'nin stderr'i Apache günlüğüne eşlemesidir. Ve bunun için bir akım var, bu yüzden file_put_contents('php://stderr', print_r($foo, TRUE))değerini $fooApache hata günlüğüne güzelce dökecek .


1
+ ayrıca , bir konsol uygulamasında hata ayıklarken error_log değerini 'php: // stdout' olarak ayarlayabilir ve hata mesajlarının doğrudan konsolda görünmesini sağlayabilirsiniz, yani: error_log ("Berbat ettin!", 3 , "php: // stdout");
stefgosselin

4
+1 Bu cevabı bulmam çok uzun sürdü. Gerçekten aradığım tek şey buydu. Dizimin ne içerdiğini nasıl göreceğimi çözemedim (Drupal'da çalışırken).
SteveS

Ben de kullanarak öneririm var_export($foo, true)yerine print_r($foo, true)eğer print_rsize ihtiyacınız tür bilgileri almaz.
Ben

Bu error_log (print_r ($ foo)) ile aynı olmaz mıydı; ?
Brunis

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

faydalı olabilir


2
Maalesef bu en uygun çözüm. Xdebug her zaman çalıştırmak için çok ağır. Sana oy
verdiler

26

Sen kullanabilirsiniz Error_log Sunucularınız hata günlük dosyasına göndermek için (veya isteğe bağlı diğer dosya İsterseniz)


21

Linux'taysanız:

file_put_contents('your_log_file', 'your_content');

veya

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

ve sonra konsolda

tail -f your_log_file

Bu, dosyaya yerleştirilen son satırı sürekli olarak gösterecektir.


9

Zihin çerçevenizi değiştirmelisiniz. PHP yazıyorsunuz, yazmaya alışkın olduğunuz başka bir şey değil. PHP'de hata ayıklama konsol ortamında yapılmaz.

PHP'de 3 kategoride hata ayıklama çözümünüz vardır:

  1. Bir web sayfasına çıktı (şeylerin daha güzel bir görünümü için dBug kitaplığına bakın).
  2. Bir günlük dosyasına yaz
  3. XDebug ile oturumda hata ayıklama

PHP'nin alışkın olduğunuz diğer diller gibi davranmasını sağlamak yerine bunları kullanmayı öğrenin.


31
Konsol uygulamaları ve çeşitli web olmayan komut dosyaları yazmak için çok zaman harcayan biri olarak , buna kibarca katılmayacağım.
stefgosselin

Konsol uygulamalarının bakımını yapmak ve geliştirmek için çok çalışıyorum ve soruyu kötü İngilizce yorumumda, onun bir konsol uygulamasında hata ayıklamak istediğini varsaymıştım. Xdebug iyi ve çok kullanışlıdır, ancak editörümde
sevmeme rağmen

1
@Stefgosselin: Netbeans hemen hemen aynı şeyi yapıyor, ancak xDebug ile gördüğüm en iyi şey Aptana'daydı.
Sylverdrag

1
Netbeans üzerinde xDebug kullanıyorum ve çoğu zaman iyi çalışıyor. Ancak, bir dosyaya bir şeyler kaydetmeniz gereken zamanlar vardır.
cosan

bunları da deneyin .. daha fazlasını yapabileceksiniz! stackoverflow.com/a/44050914/2053479
ganesh

5

Konsolda hata ayıklıyor musunuz? PHP'de hata ayıklamak için çeşitli seçenekler vardır. Hızlı ve kirli hata ayıklama için kullanılan en yaygın işlev var_dump'tır .

Her ne kadar var_dump harika olsa ve birçok insan her şeyi bununla yapsa da, onu biraz renklendirebilecek başka araçlar ve teknikler de var.

Bir web sayfasında hata ayıklama yapıyorsanız yardımcı olacak şeyler <pre> </pre>, diziler ve nesneler üzerinde size uygun biçimlendirme sağlamak için etiketleri dump ifadenizin etrafına sarın .

yani:

<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>

Ve son olarak, hata ayıklamanızın hataları görüntüleyecek şekilde ayarlandığından emin olun. Bunu yapmak için sunucu yapılandırmasına erişemiyorsanız bunu komut dosyanızın en üstüne eklemek gerekebilir.

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

İyi şanslar!


2

Zend gibi bir çerçeveyi entegre etmek istemiyorsanız , php hata günlüğüne oturum açmak için trigger_error yöntemini kullanabilirsiniz .


2

Basit bir yol, trigger_error:

 trigger_error("My error");

ancak dizileri veya Nesneleri koyamazsınız bu nedenle

var_dump

trigger_error muhtemelen hata günlüklerinize yazmanın en iyi yoludur. Daha sonra bazı özel verilerle günlük satırlarını değiştirmek istediğinizde kendinize teşekkür edeceksiniz.
Anshul

2

Bunun gibi bir dosyaya da yazabilirsiniz:

$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();

Php'nin dosyaya ( 775) erişip yazabilmesi için uygun izinlerin ayarlandığından emin olun .



1

Bu, php hata ayıklama ve günlüğe kaydetme için harika bir araç: PHp Hata Ayıklayıcı ve Kaydedici

Yalnızca 3 satır kodla kutudan çıkar çıkmaz çalışır. Ajax hata ayıklaması için js konsoluna mesajlar gönderebilir ve hata işleyicinin yerini alabilir. Ayrıca var_dump () ve print_r () gibi değişkenler hakkındaki bilgileri daha okunaklı bir biçimde döker. Çok güzel bir araç!


1

Bunların çoğunu kullandım, ancak genellikle geliştirirken hata ayıklamam gerektiğinden ve localhost üzerinde geliştirdiğim için, başkalarının tavsiyelerine uydum ve şimdi tarayıcının JavaScript hata ayıklama konsoluna yazıyorum (bkz. Http: //www.codeforest. net / hata ayıklama-php-in-tarayıcılar-javascript-console ).

Bu, tarayıcımda PHP'min oluşturduğu web sayfasına bakabileceğim ve herhangi bir hata ayıklama izini hızlı bir şekilde göstermek / gizlemek için F12'ye basabileceğim anlamına geliyor.

Sürekli olarak hata ayıklayıcı, CSS düzeni vb. Geliştirici araçlarına baktığım için, oradaki PHP loggonuma bakmak mantıklı geliyor.

Biri bize bu kodu kararlaştırırsa, küçük bir değişiklik yaptım. Sonra

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

ekledim

$name = 'PHP: ' . $name;

Bunun nedeni, sunucu tarafımın PHP'nin JavaScript içeren HTML oluşturması ve PHP ve JS çıktılarını ayırt etmeyi yararlı buluyorum.

(Not: Şu anda bunu farklı çıktı türlerini açıp kapatmama izin verecek şekilde güncelliyorum: PHP'den, JS'den ve veritabanı erişimi)


1

Cakephp kullanıyorum, bu yüzden kullanıyorum:

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

0

Kullanabilirsiniz:

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

2
bunun çok fazla yükü var. Neden basit bir hata çıktısı için javascript'i çağırmalısınız?
clockw0rk

-8

Kullanabilirsiniz

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

veya bu ifadeyi bir günlüğe yazdırmak istiyorsanız,

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

8
AddLog? Bu yerel bir işlev değildir.
stefgosselin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.