2009-12-18 10 views
10

Nel mio file di configurazione CI Ho questo set di registrazione soglia:codeigniter registrazione troppo

$config['log_threshold'] = 1; 

In index.php, ho impostato il seguente segnalazione di errore:

error_reporting(E_ERROR); 

La mia aspettativa è che questo registrerà eventuali errori CI che registro (usando log_message('error','my error message')), così come eventuali errori PHP. Tuttavia, mi aspetto che non registri le notifiche PHP, solo gli errori. Tuttavia, quando guardo i file di log, sembra registrare PHP accorge troppo:

ERRORE - 2009-12-18 13: 21: 50-> Gravità: Avviso -> Variabile non definita: pageIndex/var /www/apps/OS4W/system/application/views/user/view.php 12
ERRORE - 2009-12-18 13: 21: 50-> Gravità: Avviso -> Variabile non definita: friendsmode/var/www/apps /OS4W/system/application/views/user/activitytable.php 207

Anche se le linee di log iniziano con “ERRORE”, in realtà, questo sembra essere un avviso di PHP, un po 'come un avvertimento, che ho non voglio accedere. Come posso assicurarmi che vengano registrati solo gli errori CI e PHP, e non le notifiche PHP? Pensavo che lo error_reporting(E_ERROR) avrebbe fatto proprio questo?

+0

Tra l'altro, si prega di Igno re i caratteri di sottolineatura extra nella funzione di segnalazione degli errori, è dovuto un problema nel pannello di anteprima di StackOverflow. – Ferdy

+0

Ho modificato la formattazione per utilizzare i blocchi di codice anziché i blockquotes per il codice. Sentiti libero di tornare indietro se vuoi, ma penso che abbia più senso usare i blocchi di codice e il testo corretto. – eyelidlessness

+0

Grazie all'eyelidnessness, decisamente un miglioramento – Ferdy

risposta

13

Prima di tutto, grazie a tutti per aver riflettuto. Dopo aver considerato il tuo consiglio, ho deciso di applicare patch al nucleo di CI. Sfortunatamente, le core classes possono essere estese, ma non il core stesso. Pertanto se si applica la stessa patch, accertarsi di documentarla.

Ecco qui. Nel sistema di \ Application \ config \ config.php ho aggiunto seduto proprio sotto l'impostazione log_treshold la seguente configurazione personalizzata:

/* 
|-------------------------------------------------------------------------- 
| 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); 

Come spiega la documentazione, in questo array di configurazione si mette i tipi di errore di PHP che si fa NON desidera accedere.

successiva, ho patchato il file core (system/codeigniter/common.php) e modificato la funzione _exception_handler

Ci sono due cambiamenti. Per prima cosa ho spostato la riga di caricamento della configurazione nella parte superiore del metodo, poiché ne ho avuto bisogno in precedenza. Trova la riga qui sotto e vedrai $ config = & get_config(); sotto di essa. Cancellalo.

Ho rimosso il // Dovremmo registrare l'errore? No? Abbiamo finito ...

In secondo luogo, il controllo di gravità viene modificato per verificare la matrice che abbiamo dichiarato. Vai all'inizio del metodo e sostituire l'istruzione if che controlla $ gravità == E_STRICT con qui sotto:

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

Queste patch consentono un controllo più fine sulla registrazione degli errori di PHP. Naturalmente, la registrazione normale dell'IC continuerà a funzionare. Come accennato, l'unico svantaggio è che questo patch il nucleo.

Spero che questo aiuti chiunque. Grazie per aver pensato!

+1

Grazie per aver condiviso questo Ferdy! – Dana

+0

Proprio come una FYI, le classi di base della CI possono ora essere estese ... – KyleFarris

1

è necessario solo un underscore nella chiamata metodo di error_reporting che PHP non riporta tali avvisi:

error_reporting(E_ERROR); 

codeigniter tratterà eventuali errori da PHP (che si tratti di un avviso, avvertimento, o un errore fatale, ecc.) come errore nei registri CI.

Modifica: Nevermind, ho appena visto il tuo commento. Non sono sicuro di cosa sta succedendo con la segnalazione degli errori.

+0

La tua risposta è ancora interessante, in particolare dove dici "Code Igniter tratterà qualsiasi errore da PHP (sia esso un avviso, un avviso o un errore fatale, ecc.) Come un errore nei registri CI. ". Sono pazzo o questo comportamento altamente indesiderato di CI? Questo tipo di renderlo un affare tutto o niente: o registrare una tonnellata o registrare nulla, nemmeno un errore. Correggetemi se ho torto, ma sembra che in questo modo CI ostacoli gravemente la segnalazione degli errori di PHP. – Ferdy

+0

Questo è impostato con un'opzione di configurazione, tutto o niente è errato. Dove l'hai sentito? –

+0

Non ho "sentito" questo, lo so. L'ho testato e debugato ed è così che funziona CI. L'opzione di configurazione di cui parli controlla errori CI, non errori PHP. Registrerà tutti gli errori PHP o nessuno. Errori CI che puoi controllare usando l'impostazione di configurazione. – Ferdy

3

Secondo gli errori PHP documentazione di rendicontazione al http://us2.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting

In PHP 4 e PHP 5 il valore di default è E_ALL & ~ E_NOTICE. Questa impostazione non mostra errori di livello E_NOTICE. Si consiglia di mostrarli durante lo sviluppo .

mi piacerebbe provare a cambiare il vostro error_reporting() per "E_ALL & ~ E_NOTICE" e vedere se funziona.

Dana

Edit: Beh, ho parlato troppo presto. Ho provato questo e si è fermato l'avviso da mostrare sullo schermo, ma ancora registrato nel file di registro.

Soluzione:

OK Credo capito questo. Nel file common.php c'è una funzione chiamata "_exception_handler" che gestisce il processo di registrazione. Effettua alcuni confronti bit a bit del livello di gravità corrente e del livello error_reporting per vedere se deve accedere allo schermo, ma non lo fa per accedere al file di registro. Passa semplicemente tutto tranne i messaggi E_STRICT che lancia indipendentemente.

Quello che puoi fare è racchiudere l'ultima riga in questa funzione con la stessa istruzione IF che usano per accedere allo schermo. Quindi l'intera funzione diventa:

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); 
} 
} 

e penso che si prenderà cura di esso. Quindi puoi utilizzare

error_reporting(E_ALL & ~E_NOTICE); 

nel tuo index.php. Ovviamente stiamo modificando il nucleo qui. Forse c'è un modo per scavalcare, invece?

Dana

+0

Per PHP normale, penso che sia corretto, ma penso che Code Igniter veda tutti gli errori PHP (se un avviso o un errore effettivo) come lo stesso e registrerà tutto o niente. – Ferdy

+0

Sì, ci ho giocato stamattina. Ho provato a cambiarlo a livello di server, ma CI ignora quelli. Non riesco a vedere in alcun modo intorno ad esso, tranne forse scavando nel nucleo della CI. – Dana

+0

Grazie mille per le indagini, lo apprezzo. Ho applicato la tua patch al core, ma ho scoperto che quando si utilizza error_reporting (E_ALL & ~ E_NOTICE) visualizzerà le notifiche sullo schermo, stranamente come questo suoni. Ho letto sul forum di CI che ci sono plug-in di registrazione, quindi penso che indagherò su quel percorso. Se avrò successo, riferirò qui in modo che tutti possano trarne beneficio. – Ferdy

1

Ho sempre appena modificato che la registrazione biblioteca di CodeIgniter. Ferdy ha ragione quando dice che CI registrerà tutto o niente. È molto indesiderato.

+0

Grazie per la conferma! – Ferdy

6

Per tutti gli altri utenti che potrebbero incontrare questo con CodeIgniter 2.0. Il problema è sempre lo stesso, ma la soluzione è "più semplice".

Hai ancora modificare un file core: /system/codeigniter/Common.php

trovare la funzione _exception_handler() (dovrebbe essere in fondo), e cambiare questa linea:

if ($severity == E_STRICT)a questo:if ($severity == E_STRICT OR $severity == E_NOTICE)

Divertente come pensano E_STRICTavvisi riempirà il registro; ma non lo sarà il E_NOTICE. O forse è bello punire le persone per non aver programmato rigorosamente e dichiarare tutte le loro variabili prima di usarle? :)

+1

Grazie! Stavo provando tutte le altre cose per 2.x e nessuna ha funzionato. Questo ha fatto. – jdborg

1

provare questo, non c'è bisogno di patch del nucleo CI:

$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); 
    } 
} 
-1

ho riparato cambiando ids per i livelli di registro nelle biblioteche/Log.php6 come:

cambiamento:

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

a:

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