2009-12-18 112 views
10

在我的CI配置文件我有這樣的記錄treshold集:代碼點火器記錄太多

$config['log_threshold'] = 1; 

在index.php文件,我已經設置了以下錯誤報告:

error_reporting(E_ERROR); 

我的期望是這將記錄我記錄的任何CI錯誤(使用log_message('error','my error message'))以及任何PHP錯誤。但是,我期望它不會記錄PHP通知,只會發生錯誤。然而,當我在看日誌文件,似乎登錄PHP注意到太:

錯誤 - 2009-12-18 13:21:50->嚴重性:通知 - >未定義的變量:的PageIndex/VAR /www/apps/OS4W/system/application/views/user/view.php 12
錯誤 - 2009-12-18 13:21:50->嚴重性:通知 - >未定義變量:friendsmode/var/www/apps /OS4W/system/application/views/user/activitytable.php 207

雖然日誌行以「ERROR」,在現實中,這似乎是一個PHP通知,有點像一個警告開始,我不想登錄。我如何確保只記錄CI和PHP錯誤,而不是PHP通知?我以爲error_reporting(E_ERROR)會這樣做?

+0

順便說一句,請igno在錯誤報告功能中重複出現下劃線,這是StackOverflow的預覽面板中的一個問題。 – Ferdy 2009-12-18 15:47:48

+0

我編輯了您的格式,以使用代碼塊而不是代碼塊引用。如果你願意,隨意回滾,但我認爲使用代碼塊和正確的文本更有意義。 – eyelidlessness 2009-12-18 18:05:42

+0

謝謝你的眼皮,絕對是一種改進 – Ferdy 2009-12-18 18:12:32

回答

13

首先,謝謝大家一起思考。在考慮你的建議後,我決定修補CI的核心。不幸的是,核心類可以擴展,但不是核心本身。因此,如果您應用相同的修補程序,請務必記錄它。

在這裏。在系統\程序\ CONFIG \ config.php文件添加以下自定義配置設置正下方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); 

如文檔說明,在此配置數組你把你做不是PHP的錯誤類型想要登錄。

接着,我已修補的核心文件(系統/笨/的common.php)和編輯_exception_handler

有兩個變化的功能。首先,讓我感動的配置負載線到方法的頂部,因爲我需要它更早。找到線下,你會看到$配置= & get_config();在它下面。刪除那個。

我刪除了//我們在錯誤日誌?沒有?我們完成了...

其次,修改嚴重性檢查以檢查我們聲明的數組。前往方法的頂部和下面替換if語句來檢查$嚴重性== E_STRICT:

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

這些補丁允許在PHP錯誤日誌細粒度控制。正常的CI記錄當然仍然有效。如前所述,唯一的缺點就是這個補丁的核心。

我希望這可以幫助任何人。謝謝你一起思考!

+1

感謝您分享這個Ferdy! – Dana 2009-12-21 14:59:49

+0

就像一個FYI,CI核心類現在可以擴展... – KyleFarris 2013-03-13 19:40:15

1

你只需要一個下劃線中的error_reporting方法調用PHP不報告的通知:

error_reporting(E_ERROR); 

代碼點火器將把從PHP任何錯誤(不管它是一個通知,警告或致命錯誤,等等)作爲CI日誌中的錯誤。

編輯:沒關係,只是看到你的評論。不知道您的錯誤報告發生了什麼。

+0

你的答案仍然很有趣,特別是在你說「Code Igniter會將CI中的任何錯誤(無論是通知,警告還是致命錯誤等)視爲CI日誌中的錯誤。 」。 我是瘋了還是這種CI非常不受歡迎的行爲?這種做法使得它成爲一個完全沒有意義的事情:記錄一個噸或者什麼都不記錄,甚至不是一個錯誤。糾正我,如果我錯了,但似乎CI這種方式嚴重妨礙PHP的錯誤報告。 – Ferdy 2009-12-18 18:18:52

+0

這是設置一個配置選項,一切或沒有不正確的。你從哪裏聽到這個消息? – 2009-12-21 09:28:28

+0

我沒有「聽到」這個,我知道。我已經測試和調試過,這就是CI的工作原理。你所說的config選項控制CI錯誤,而不是PHP錯誤。它會記錄所有PHP錯誤或根本沒有。您可以使用該配置設置控制CI錯誤。 – Ferdy 2009-12-21 10:04:44

3

按照PHP錯誤報告文檔在http://us2.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting

在PHP 4和PHP 5的默認值是 E_ALL &〜E_NOTICE。此設置 不顯示E_NOTICE級別錯誤。 您可能想在 開發過程中顯示它們。

我想嘗試改變你的error_reporting()到「E_ALL &〜E_NOTICE」,看看是否有效。

達納

編輯:好吧,我說得太快了。我試過了,它停止了在屏幕上顯示的通知,但仍將其記錄到日誌文件中。

解決方案:

好的我想我明白了這一點。在common.php文件中有一個叫做「_exception_handler」的函數來處理日誌過程。它會對當前嚴重級別和error_reporting級別進行按位比較,以查看它是否應該登錄到屏幕,但是它不會記錄到日誌文件中。除了E_STRICT消息之外,IT只是將所有內容都傳遞給它,不管它如何處理。

你可以做的就是將最後一行在此函數相同的,如果他們使用記錄到屏幕上發言。所以整個功能變爲:

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

我認爲會照顧它的。然後你可以在你的index.php中使用

error_reporting(E_ALL & ~E_NOTICE); 

。當然,我們正在編輯核心。也許有一種方法可以覆蓋呢?

Dana

+0

對於正常的PHP,我認爲這是正確的,但我認爲Code Igniter會將所有PHP錯誤(無論是通知還是實際錯誤)視爲相同,並會記錄全部或全部。 – Ferdy 2009-12-18 18:16:37

+0

是的,今天早上我一直在玩它。試圖改變它在服務器級別,但CI忽略這些。除了挖掘CI核心之外,看不到任何方法。 – Dana 2009-12-18 18:55:34

+0

非常感謝你的調查,我很感激。我將你的補丁應用到核心,但發現使用error_reporting(E_ALL&〜E_NOTICE)時,它會在屏幕上顯示通知,奇怪的是,這聽起來像。我在CI論壇上看到有插件,所以我想我會調查這個路徑。如果我成功了,我會在這裏報告,以便所有人都能受益。 – Ferdy 2009-12-19 08:56:06

1

我一直在修改CodeIgniter的日誌庫。當Ferdy說CI會記錄一切或不記錄時,Ferdy是正確的。這是非常不希望的。

+0

感謝您的確認! – Ferdy 2009-12-19 18:49:48

6

對於任何其他人可能會遇到這種使用CodeIgniter 2.0。問題仍然是一樣的,但解決方案「更容易」。

你仍然需要修改一個核心文件:/system/codeigniter/Common.php

找到_exception_handler()功能(應該是在底部),並更改該行:

if ($severity == E_STRICT)這樣:if ($severity == E_STRICT OR $severity == E_NOTICE)

有趣的是他們認爲E_STRICT通知會填滿日誌;但E_NOTICE不會。或者,對於沒有嚴格編碼並且在使用它們之前聲明所有變量的人來懲罰他們呢? :)

+1

謝謝!我正在嘗試所有其他的2.x的東西,沒有一個工作。這樣做。 – jdborg 2012-05-22 08:19:28

1

試試這個,無需補丁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

我固定它通過更改日誌級別IDS在圖書館/ Log.php6像:

變化:

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

到:

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