2009-12-18 5 views
10

Dans mon fichier de configuration de CI Je cette treshold de journalisation ensemble:CodeIgniter trop

$config['log_threshold'] = 1; 

En index.php, j'ai mis les rapports d'erreur suivant:

error_reporting(E_ERROR); 

Mon attente est que cela enregistrera toutes les erreurs CI que je connecte (en utilisant log_message('error','my error message')), ainsi que toutes les erreurs PHP. Cependant, je m'attendrais à ce qu'il n'enregistre pas les avis PHP, seulement des erreurs. Cependant, quand je regarde les fichiers journaux, il semble se connecter PHP remarque aussi:

ERREUR - 2009-12-18 13: 21: 50-> Gravité: Avis -> Undefined variable: pageindex/var /www/apps/OS4W/system/application/views/user/view.php 12
ERREUR - 2009-12-18 13: 21: 50-> Gravité: Remarque -> Variable indéfinie: friendsmode/var/www/apps /OS4W/system/application/views/user/activitytable.php 207

Bien que les lignes de journaux commencent par « erreur », en réalité, cela semble être un avis de PHP, un peu comme un avertissement, que je Je ne veux pas me connecter Comment puis-je m'assurer que seules les erreurs CI et PHP sont enregistrées, mais pas les notifications PHP? Je pensais que error_reporting(E_ERROR) ferait exactement cela?

+0

Par ailleurs, s'il vous plaît igno En ce qui concerne les caractères de soulignement supplémentaires dans la fonction de rapport d'erreurs, cela est dû à un problème dans le panneau de prévisualisation de StackOverflow. – Ferdy

+0

J'ai modifié votre mise en forme pour utiliser des blocs de code plutôt que des blockquotes pour le code. N'hésitez pas à revenir en arrière si vous voulez, mais je pense qu'il est plus logique d'utiliser les blocs de code et le texte correct. – eyelidlessness

+0

Merci pour l'absence de paupières, certainement une amélioration – Ferdy

Répondre

13

Tout d'abord, merci à tous d'avoir réfléchi. Après avoir examiné votre avis, j'ai décidé de patcher le noyau de CI. Malheureusement, les classes de base peuvent être étendues, mais pas le noyau lui-même. Par conséquent, si vous appliquez le même correctif, assurez-vous de le documenter.

Voilà. Dans le système application \ \ config \ config.php j'ai ajouté le paramètre config personnalisé suivant juste en dessous du réglage log_treshold:

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

Comme la documentation explique, dans ce tableau de configuration vous mettez les types d'erreur PHP que vous ne PAS voulez vous connecter.

Ensuite, j'ai patché le fichier de base (système/CodeIgniter/common.php) et édité la fonction _exception_handler

Il y a deux changements. D'abord, j'ai déplacé la ligne de chargement de config vers le haut de la méthode, puisque j'en ai besoin plus tôt. Trouvez la ligne ci-dessous et vous verrez $ config = & get_config(); dessous. Supprimer cela.

J'ai supprimé le // Faut-il enregistrer l'erreur? Non? Nous avons terminé ...

Ensuite, la vérification de la gravité est modifiée pour vérifier le tableau que nous avons déclaré. Aller en haut de la méthode et de remplacer l'instruction if qui vérifie la gravité de $ == E_STRICT avec ci-dessous:

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

Ces patchs permettent un contrôle fin sur l'enregistrement des erreurs PHP. La journalisation CI normale continuera bien sûr à fonctionner. Comme mentionné, le seul inconvénient est que cela corrige le noyau.

J'espère que cela aide tout le monde. Merci d'avoir réfléchi!

+1

Merci d'avoir partagé ce Ferdy! – Dana

+0

Juste comme un FYI, les classes de noyau de CI peuvent maintenant être prolongées ... – KyleFarris

1

Vous avez juste besoin d'un trait de soulignement dans la méthode error_reporting appel que PHP ne rapporte pas ces avis:

error_reporting(E_ERROR); 

CodeIgniter traitera toute erreur de PHP (que ce soit un avis, avertissement ou erreur fatale, etc.) comme une erreur dans vos journaux CI.

Modifier: Nevermind, juste vu votre commentaire. Vous ne savez pas ce qui se passe avec vos rapports d'erreurs.

+0

Votre réponse est toujours intéressante, en particulier lorsque vous dites "Code Igniter traitera toute erreur de PHP (qu'il s'agisse d'un avis, avertissement ou erreur fatale, etc.) comme une erreur dans vos journaux CI. ". Suis-je fou ou est ce comportement très indésirable de CI? Ce genre de faire un tout ou rien: Soit une tonne de log ou rien du tout, pas même une erreur. Corrigez-moi si je me trompe, mais il semble que CI de cette façon sévèrement handicape les rapports d'erreur de PHP. – Ferdy

+0

Ceci est défini avec une option de configuration, tout ou rien est incorrect. Où as-tu entendu ça? –

+0

Je n'ai pas "entendu" ça, je le sais. J'ai testé et débogué et c'est ainsi que fonctionne CI. L'option de configuration dont vous parlez contrôle les erreurs CI, pas les erreurs PHP. Il consignera toutes les erreurs PHP ou pas du tout. Erreurs CI que vous pouvez contrôler en utilisant ce paramètre de configuration. – Ferdy

3

Selon les rapports d'erreurs PHP docs à http://us2.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting

En PHP 4 et PHP 5, la valeur par défaut est E_ALL & ~ E_NOTICE. Ce paramètre n'affiche pas les erreurs de niveau E_NOTICE. Vous pouvez les montrer pendant le développement .

Je vais essayer de changer votre error_reporting() à "E_ALL & ~ E_NOTICE" et voir si cela fonctionne.

Dana

Edit: Eh bien, j'ai parlé trop tôt. J'ai essayé ceci et cela a empêché l'affichage de s'afficher à l'écran, mais l'a quand même enregistré dans le fichier journal.

Solution:

OK Je pense que je me suis dit cela. Dans le fichier common.php, il y a une fonction appelée "_exception_handler" qui gère le processus de journalisation. Il effectue des comparaisons au niveau du niveau de gravité actuel et au niveau error_reporting pour voir s'il doit se connecter à l'écran, mais il ne le fait pas pour se connecter au fichier journal. Il ne fait que passer tout sauf les messages E_STRICT qu'il lance sans se soucier de rien.

Ce que vous pouvez faire est d'enrouler la toute dernière ligne de cette fonction avec la même instruction IF qu'ils utilisent pour se connecter à l'écran. Donc, toute la fonction devient:

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

et je pense que cela va prendre soin d'elle. Ensuite, vous pouvez utiliser

error_reporting(E_ALL & ~E_NOTICE); 

dans votre index.php. Bien sûr, nous éditons le noyau ici. Peut-être qu'il y a un moyen de remplacer à la place?

Dana

+0

Pour PHP normal, je pense que c'est correct, mais je pense que Code Igniter voit toutes les erreurs de PHP (que ce soit un avis ou une erreur réelle) comme le même et enregistrera tout ou rien. – Ferdy

+0

Oui, j'ai joué avec ce matin. J'ai essayé de le changer au niveau du serveur mais CI les ignore. Je ne vois pas d'autre moyen que cela, sauf peut-être creuser dans le noyau CI. – Dana

+0

Merci beaucoup d'avoir enquêté, je l'apprécie. J'ai appliqué votre patch au noyau, mais j'ai trouvé que lors de l'utilisation de error_reporting (E_ALL & ~ E_NOTICE) il affichera des notifications à l'écran, étrangement que cela puisse paraître. J'ai lu sur le forum CI qu'il existe des plugins de connexion, donc je pense que je vais étudier cette voie. Si je réussis, je rapporterai ici pour que tous puissent en bénéficier. – Ferdy

1

J'ai toujours simplement modifié cette bibliothèque de l'exploitation forestière CodeIgniter. Ferdy a raison quand il dit que CI enregistrera tout ou rien. C'est très indésirable.

+0

Merci de votre confirmation! – Ferdy

6

Pour tous ceux qui pourraient rencontrer cela avec CodeIgniter 2.0. Le problème est toujours le même, mais la solution est "plus facile".

Vous devez toujours modifier un fichier de base: /system/codeigniter/Common.php

Trouver la fonction _exception_handler() (devrait être en bas), et changer cette ligne:

if ($severity == E_STRICT)à ceci:if ($severity == E_STRICT OR $severity == E_NOTICE)

Drôle comment ils pensent E_STRICTavis remplira le journal; mais E_NOTICE ne sera pas. Ou peut-être que c'est bien de punir les gens de ne pas coder strictement et de déclarer toutes leurs variables avant de les utiliser? :)

+1

Merci! J'essayais tous les autres trucs pour 2.x et rien de tout cela n'a fonctionné. Cela a fait. – jdborg

1

essayer cela, pas besoin de patcher noyau 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

i fixe en changeant ids pour les niveaux de journaux dans les bibliothèques/Log.php6 comme:

changement:

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

à:

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