Kod Ateşleyici çok günlüğü

7 Cevap php

Benim CI yapılandırma dosyasında bu günlük eşik seti var:

$config['log_threshold'] = 1;

Index.php, ben aşağıdaki hata raporlama belirledik:

error_reporting(E_ERROR);

Benim beklentim bu ben (log_message('error','my error message') kullanarak) yanı sıra, herhangi bir PHP hatalarını oturum herhangi bir CI hataları oturum olacaktır. Ancak, ben PHP bildirimleri, yalnızca hataları günlüğe olmaz beklenebilir. Ben günlük dosyalarına bakmak Ancak, çok PHP bildirimlerini oturum görünüyor:

ERROR - 2009-12-18 13:21:50—> Severity: Notice —> Undefined variable: pageindex /var/www/apps/OS4W/system/application/views/user/view.php 12
ERROR - 2009-12-18 13:21:50—> Severity: Notice —> Undefined variable: friendsmode /var/www/apps/OS4W/system/application/views/user/activitytable.php 207

Günlük çizgileri "HATA" ile başlayan rağmen, gerçekte bu oturum istemiyorum tür bir uyarı gibi, bir PHP haber gibi görünüyor. Nasıl emin sadece CI yapabilir ve PHP hataları PHP bildirimler değil kaydedilir, henüz edilir? I error_reporting(E_ERROR) sadece bunu düşündüm?

7 Cevap

Her şeyden önce, birlikte düşünme için hepinize teşekkür ederim. Sizin tavsiye düşündükten sonra, ben CI çekirdek yama karar verdi. Ne yazık ki, çekirdek sınıfları çekirdek kendisi genişletilmiş, ama edilebilir. Eğer aynı yama uygulamak nedenle, bunu belgelemek için emin olun.

İşte gider. Sistem \ uygulama \ config \ config.php Birazdan log_treshold ayardan ayar aşağıdaki özel yapılandırması eklendi:

/*
|--------------------------------------------------------------------------
| Error Logging Exclusions (custom config addition by Ferdy Christant)
|--------------------------------------------------------------------------
|
| By default, CI will log all PHP errors, whether it is a notice, warning
| or error. Or, by setting the above treshold to 0, it will log nothing
| In most cases, however, you will want to log PHP errors but not the notices
| In the array below, simply place the PHP error constant that you do NOT
| want to see logged. 
|
| For a live site you'll usually use the config as follow:
|
| $config['exclude_logging'] = array(E_STRICT,E_NOTICE);
|
*/

$config['exclude_logging'] = array(E_STRICT,E_NOTICE);

Belgeleri açıkladığı gibi, bu yapılandırma dizide sen NOT oturum istiyorsun PHP hata türlerini koydu.

Sonra, ben çekirdek dosyası yamalı (sistem / CodeIgniter / common.php) ve fonksiyon _exception_handler düzenledikten

Iki değişiklik vardır. İlk olarak, ben bunu daha önce ihtiyacı olduğundan, yöntemin üst yapılandırma yükleme hattını taşındı. Aşağıdaki satırı bulun ve $ config = & göreceksiniz get_config (); altında. Bunu silmek.

I / / biz hata log mı kaldırıldı? Hayır mı? Biz bitti ...

İkincisi, şiddeti için onay biz ilan dizi kontrol etmek için modifiye edilir. Yöntemin üstüne gidin ve aşağıdaki ile $ şiddetini kontrol eğer deyimi == E_STRICT değiştirin:

$config =& get_config();
if (in_array($severity,$config['exclude_logging']))
{
return;
}

Bu yamalar PHP hata günlüğü üzerinde ince taneli kontrolü için izin verir. Normal CI günlük ders çalışmaya devam eder. Belirtildiği gibi, sadece olumsuz bu çekirdek yamalar olmasıdır.

Ben bu kimse yardımcı olur umarım. Birlikte düşünme için teşekkür ederiz!

Başkasının CodeIgniter 2.0 ile bu rastlamak olabilir için. Sorun hala aynı, ama çözüm "daha kolay" olduğunu.

Hala bir çekirdek dosyasını değiştirmek gerekiyor: /system/codeigniter/Common.php

(Altta olmalı), ve bu hat değiştirmek _exception_handler() fonksiyonu bulmak:

if ($severity == E_STRICT) to this: if ($severity == E_STRICT OR $severity == E_NOTICE)

Onlar E_STRICT notices günlük dolmaya ne kadar komik; ama E_NOTICE olmaz. Ya da belki bunları kullanmadan önce tüm değişkenleri kesinlikle kodlama ve ilan değil, insanları cezalandırmak için iyi mi? :)

http://us2.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting de PHP hata raporlama Docs göre

In PHP 4 and PHP 5 the default value is E_ALL & ~E_NOTICE. This setting does not show E_NOTICE level errors. You may want to show them during development.

I () için "E_ALL & ~ E_NOTICE" sizin error_reporting değiştirmeyi deneyin ve çalıştığını görmek istiyorum.

Dana

Düzenleme: Evet, ben de kısa bir süre konuştu. Bunu denedim ve ekranda gösterilmesini haber durdu, ama yine de günlük dosyasına kaydedilir.

Çözüm:

Tamam ben bu çözdüm. Common.php dosyasındaki günlük süreci işler "_exception_handler" adında bir işlevi var. Bu akım şiddeti seviyesi ve ekrana oturum, görmek için error_reporting düzey bazı bitsel karşılaştırmalar yapar, ancak günlük dosyaya giriş için bunu yapmaz. BT sadece ne olursa olsun fırlatır E_STRICT iletileri dışında üzerinden her şeyi geçer.

Ne yapabilirim onlar ekranına giriş için kullandığınız aynı IF deyimi ile bu işlevi çok son satırı şal olduğunu. Yani tüm fonksiyonu olur:

function _exception_handler($severity, $message, $filepath, $line)
{   
 // We don't bother with "strict" notices since they will fill up
 // the log file with information that isn't normally very
 // helpful.  For example, if you are running PHP 5 and you
 // use version 4 style class functions (without prefixes
 // like "public", "private", etc.) you'll get notices telling
 // you that these have been deprecated.

if ($severity == E_STRICT)
{
	return;
}

$error =& load_class('Exceptions');

// Should we display the error?
// We'll get the current error_reporting level and add its bits
// with the severity bits to find out.	
if (($severity & error_reporting()) == $severity)
{
	$error->show_php_error($severity, $message, $filepath, $line);
}

// Should we log the error?  No?  We're done...
$config =& get_config();
if ($config['log_threshold'] == 0)
{
	return;
}

if (($severity & error_reporting()) == $severity)
{
	$error->log_exception($severity, $message, $filepath, $line);
}
}

ve ben bunun ilgilenir düşünüyorum. Sonra kullanabilirsiniz

error_reporting(E_ALL & ~E_NOTICE);

sizin index.php. Tabii biz burada çekirdek düzenliyorsunuz. Belki yerine geçersiz kılmak için bir yol var?

Dana

PHP bu bildirimleri bildirmez error_reporting yöntem çağrısında sadece tek bir çizgi gerekir:

error_reporting(E_ERROR);

Kod Ateşleyici CI günlükleri bir hata olarak PHP herhangi bir hata (vb, bir ihbar, uyarı, ya da ölümcül hata olsun) tedavi edecek.

Düzenleme: Nevermind, sadece yorum gördüm. Değil sizin hata raporlama ile neler emin.

Ben her zaman sadece CodeIgniter o günlüğü kütüphane modifiye ettik. O CI ya da hiçbir ya oturum diyor ne Ferdy doğrudur. Çok istenmeyen bulunuyor.

Bu deneyin, CI çekirdek yama gerek yok:

$hook['pre_controller'] = array(
    'class'    => 'MY_Commonfunction_hook',
    'function' => 'hook',
    'filename' => 'MY_Commonfunction_hook.php',
    'filepath' => 'hooks');

class MY_Commonfunction_hook {
    public function hook() {
        set_error_handler('_my_exception_handler');
    }
}

function _my_exception_handler($severity, $message, $filepath, $line) {
    if ($severity == E_STRICT) {
        return;
    }
    $_error = & load_class('Exceptions', 'core');
    if (($severity & error_reporting()) == $severity) {
        for ($i = ob_get_level(); $i > 0; $i--) {
            @ob_end_clean();
        }
        $_error->show_php_error($severity, $message, $filepath, $line);
    }
    if (config_item('log_threshold') == 0) {
        return;
    }
    if (($severity & error_reporting()) == $severity) {
        $_error->log_exception($severity, $message, $filepath, $line);
    }
}

i gibi libraries/Log.php6 de günlük düzeyi için kimliklerini değiştirerek sabit:

değiştirin:

protected $_levels  = array('ERROR' => '1', 'DEBUG' => '2',  'INFO' => '3', 'ALL' => '4');

için:

protected $_levels  = array('ERROR' => '1', 'DEBUG' => '3',  'INFO' => '2', 'ALL' => '4');