2009-12-18 8 views
10

En mi archivo de configuración CI tengo este conjunto de registro de umbral:CodeIgniter tala demasiado

$config['log_threshold'] = 1; 

en index.php, he puesto el siguiente informe de errores:

error_reporting(E_ERROR); 

Mi expectativa es que esto registrará cualquier error de CI que registre (usando log_message('error','my error message')), así como cualquier error de PHP. Sin embargo, esperaría que no registre avisos PHP, solo errores. Sin embargo, cuando miro a los archivos de registro, parece que entrar PHP da cuenta demasiado:

ERROR - 2009-12-18 13: 21: 50-> Severidad: Aviso -> Undefined variable: pageindex/var /www/apps/OS4W/system/application/views/user/view.php 12
ERROR - 2009-12-18 13: 21: 50-> Gravedad: Aviso -> Variable no definida: friendsmode/var/www/apps /OS4W/system/application/views/user/activitytable.php 207

Aunque las líneas de registro comienzan con “ERROR”, en realidad, esto parece ser un aviso de PHP, como una especie de advertencia, que yo no quiero iniciar sesión ¿Cómo puedo asegurarme de que solo se registran los errores de CI y PHP, pero no los avisos de PHP? Pensé que error_reporting(E_ERROR) haría exactamente eso?

+0

Por cierto, por favor igno Con los subrayados adicionales en la función de informe de errores, se debe a un problema en el panel de vista previa de StackOverflow. – Ferdy

+0

Edité el formato para usar bloques de código en lugar de bloques para el código. Siéntase libre de retroceder si lo desea, pero creo que tiene más sentido utilizar los bloques de código y el texto correcto. – eyelidlessness

+0

Gracias a la falta de definición, definitivamente una mejora – Ferdy

Respuesta

13

Antes que nada, gracias a todos por pensar en ello. Después de considerar su consejo, decidí parchear el núcleo de CI. Lamentablemente, las clases principales pueden ampliarse, pero no el núcleo en sí. Por lo tanto, si aplica el mismo parche, asegúrese de documentarlo.

Aquí va. En el sistema \ application \ config \ config.php añadí ajuste de la derecha por debajo del ajuste log_treshold la siguiente configuración personalizada:

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

Como explica la documentación, en esta matriz de configuración de poner los tipos de error de PHP que haces NO quiere iniciar sesión.

A continuación, he parcheado el archivo central (sistema/CodeIgniter/Common.php) y editado la función _exception_handler

Hay dos cambios. Primero, moví la línea de carga de configuración a la parte superior del método, ya que lo necesito antes. Busque la línea siguiente y verá $ config = & get_config(); bajo ello. Eliminar eso

Eliminé // ¿Deberíamos registrar el error? ¿No? Hemos terminado ...

En segundo lugar, la verificación de la gravedad se modifica para verificar la matriz que hemos declarado. Hacia el comienzo del método y sustituyen a la sentencia if que comprueba $ severidad == E_STRICT con continuación:

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

Estos parches permiten un control preciso sobre el registro de errores de PHP. Normalmente, el registro normal de IC seguirá funcionando. Como se mencionó, el único inconveniente es que esto revisa el núcleo.

Espero que esto ayude a cualquiera. ¡Gracias por pensar!

+1

Gracias por compartir este Ferdy! – Dana

+0

Al igual que un FYI, las clases principales de CI ahora se pueden ampliar ... – KyleFarris

1

que necesita sólo uno de subrayado en la llamada al método error_reporting que PHP no informa de estos avisos:

error_reporting(E_ERROR); 

CodeIgniter tratará cualquier error de PHP (si se trata de un aviso, advertencia o error grave, etc.) como un error en sus registros de CI.

Editar: No importa, acabo de ver tu comentario. No estoy seguro de qué está pasando con su informe de errores.

+0

Su respuesta aún es interesante, específicamente cuando dice "Code Igniter tratará cualquier error de PHP (ya sea un aviso, advertencia o error fatal, etc.) como un error en sus registros de CI. ". ¿Estoy loco o es este comportamiento altamente indeseable de CI? Esto hace que sea un acuerdo de todo o nada: o registre una tonelada o no registre nada, ni siquiera un error. Corrígeme si me equivoco, pero parece que CI de esta manera perjudica severamente el informe de errores de PHP. – Ferdy

+0

Esto se establece con una opción de configuración, todo o nada es incorrecto. ¿Donde escuchaste esto? –

+0

No "oí" esto, lo sé. Lo probé y depuré y así es como funciona CI. La opción de configuración de la que hablas controla los errores de CI, no los errores de PHP. Registrará todos los errores de PHP o ninguno. Errores de CI que puede controlar usando esa configuración. – Ferdy

3

De acuerdo con los documentos de presentación de informes de error PHP en http://us2.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting

En PHP 4 y PHP 5 el valor predeterminado es E_ALL & ~ E_NOTICE. Esta configuración no muestra errores de nivel E_NOTICE. Es posible que desee mostrarlos durante el desarrollo de .

que iba a tratar de cambiar su error_reporting() para "E_ALL & ~ E_NOTICE" y ver si funciona.

Dana

Editar: Bueno, he hablado demasiado pronto. Intenté esto e impidió que apareciera el aviso en la pantalla, pero aún así lo logré en el archivo de registro.

Solución:

OK Creo que cuenta de esto. En el archivo common.php hay una función llamada "_exception_handler" que maneja el proceso de registro. Realiza algunas comparaciones bit a bit del nivel de gravedad actual y el nivel de error_reporting para ver si debe iniciar sesión en la pantalla, pero no lo hace para iniciar sesión en el archivo de registro. Simplemente lo pasa todo a excepción de los mensajes E_STRICT que arroja independientemente.

Lo que puede hacer es ajustar la última línea de esta función con la misma instrucción IF que utilizan para iniciar sesión en la pantalla. Así que toda la función se convierte en:

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

y creo que se encargará de ello. Luego puede usar

error_reporting(E_ALL & ~E_NOTICE); 

en su index.php. Por supuesto, estamos editando el núcleo aquí. Tal vez hay una manera de anular en su lugar?

Dana

+0

Para PHP normal, creo que esto es correcto, pero creo que Code Igniter ve todos los errores de PHP (ya sea un aviso o un error real) como iguales y registrará todo o nada. – Ferdy

+0

Sí, he estado jugando con él esta mañana. Intenté cambiarlo en el nivel del servidor pero CI los ignora. No puedo ver ninguna forma de evitarlo, excepto tal vez cavar en el núcleo de CI. – Dana

+0

Muchas gracias por investigar, lo agradezco. Apliqué tu parche al núcleo, pero encontré que al usar error_reporting (E_ALL & ~ E_NOTICE) mostrará avisos en la pantalla, por extraño que parezca. He leído en el foro de CI que hay complementos de registro, por lo que creo que voy a investigar ese camino. Si tengo éxito, informaré aquí para que todos puedan beneficiarse. – Ferdy

1

Siempre he modificado que registrar la biblioteca de CodeIgniter. Ferdy está en lo correcto cuando dice que CI registrará todo o nada. Es muy indeseado.

+0

¡Gracias por confirmar! – Ferdy

6

Para cualquier otra persona que pueda encontrar esto con CodeIgniter 2.0. El problema sigue siendo el mismo, pero la solución es "más fácil".

Usted todavía tiene que modificar un archivo de núcleo: /system/codeigniter/Common.php

encontrar la función _exception_handler() (debería ser en la parte inferior), y cambiar esta línea:

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

Es curioso cómo piensan E_STRICTavisos llenará el registro; pero E_NOTICE no lo hará. ¿O tal vez es bueno castigar a las personas por no codificar estrictamente y declarar todas sus variables antes de usarlas? :)

+1

¡Gracias! Estaba probando todo lo demás para 2.x y nada de eso funcionó. Esto hizo. – jdborg

1

probar esto, no hay necesidad de parche CI núcleo:

$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

i fijo cambiando ids para niveles de registro en las bibliotecas/Log.php6 como:

cambio:

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

a:

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