2013-05-14 82 views
4

我一直在我的網站上工作了一年多了,我非常渴望終於把它推出去供人們使用。然而,它已經變得相當大 - 我幾乎想要脫離我的控制 - 而且,我真的只是一個自學成才的業餘程序員。如何更改PHP在錯誤日誌文件中寫入錯誤的方式?

所以我想確保php生成的任何錯誤都記錄在文件中,因此我可以訪問此文件並跟蹤錯誤。

目前我的設置如下:

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', '0'); 
ini_set('log_errors', 1); 
ini_set('error_log', 'errors.log'); 
?> 

作品不錯,到目前爲止,我的error.log文件將包含這樣的東西:

[14日​​,2013 00:16 :26] PHP注意:未定義的變量:在/home/www/dir/index.php在第14行中的非實際變量[14-May-2013 00:16:28] PHP注意:未定義變量:/ home/www/dir中的非實例變量/index.php on line 14

好,記錄錯誤。

但現在我有一個問題:

  1. 他們都在同一行,沒有休息。使其難以閱讀。我如何在一個新行中得到每個錯誤?

  2. 我看到有一個時間戳。真棒!我怎樣才能添加用戶的IP地址或任何其他自定義的東西?

同樣,我的問題:

如何更改PHP在錯誤日誌文件中寫入錯誤的方式? 特別是,如何在記錄每個錯誤之後創建一個新行,以便error.log文件更易於閱讀。我如何添加自定義數據和值,如IP地址?

答: 我結束了做以下 - 這似乎在一定程度上重現了什麼PHP是通過標準做的和可以從那裏進行修改。

<?php 
function my_error_handler($type, $message, $file, $line, $vars) 
{ 
    switch($type) 
    { 
     case 1: // 1 // 
      $type_str = 'ERROR'; 
      break; 
     case 2: // 2 // 
      $type_str = 'WARNING'; 
      break; 
     case 4: // 4 // 
      $type_str = 'PARSE'; 
      break; 
     case 8: // 8 // 
      $type_str = 'NOTICE'; 
      break; 
     case 16: // 16 // 
      $type_str = 'CORE_ERROR'; 
      break; 
     case 32: // 32 // 
      $type_str = 'CORE_WARNING'; 
      break; 
     case 64: // 64 // 
      $type_str = 'COMPILE_ERROR'; 
      break; 
     case 128: // 128 // 
      $type_str = 'COMPILE_WARNING'; 
      break; 
     case 256: // 256 // 
      $type_str = 'USER_ERROR'; 
      break; 
     case 512: // 512 // 
      $type_str = 'USER_WARNING'; 
      break; 
     case 1024: // 1024 // 
      $type_str = 'USER_NOTICE'; 
      break; 
     case 2048: // 2048 // 
      $type_str = 'STRICT'; 
      break; 
     case 4096: // 4096 // 
      $type_str = 'RECOVERABLE_ERROR'; 
      break; 
     case 8192: // 8192 // 
      $type_str = 'DEPRECATED'; 
      break; 
     case 16384: // 16384 // 
      $type_str = 'USER_DEPRECATED'; 
      break; 
    } 


    $errormessage = '[ '.date(r).' ] '.$type_str.': '.$message.' in '.$file.' on line '.$line."\n"; 
    // for development simply ECHO $errormessage; 

     $file = 'my_errors.log'; 
     file_put_contents($file, $errormessage, FILE_APPEND); 
} 

error_reporting(E_ALL); 
ini_set('display_errors', '0'); 
set_error_handler('my_error_handler'); 

?> 
+0

這也是在這個線程討論http://stackoverflow.com/questions/30630484/is-it-possible-to-change-php-error-log-output – Salagir 2017-02-22 10:03:39

+0

這也在http:// stackoverflow中討論.com/questions/30630484/is-it-possible-to-change-php-error-log-output – Salagir 2017-02-22 10:05:46

+0

這也在http:// stackoverflow上討論。com/questions/30630484/is-it-it-it-change-php-error-log-output – Salagir 2017-02-22 10:06:48

回答

3

你不能做任何額外的定製或實施任何與內置的錯誤處理程序邏輯的,你需要與set_error_handler()設置自己的錯誤處理。

該函數需要一個回調,當PHP遇到錯誤時將調用該回調,並且您可以相應地採取行動。

請參閱文檔中有關如何使用此函數以及如何實現適當回調的示例。

+0

我可以獲得標準/內置錯誤處理程序的代碼副本,以便我可以從那裏進行修改現有的代碼? – olli 2013-05-14 16:23:11

+1

我懷疑這對你有任何用處。據我所知,內置的錯誤處理程序是用C實現的,因爲它在PHP的內部。 – nickb 2013-05-14 16:25:24

+0

感謝您的幫助!我在原始問題中添加了一些代碼,以顯示我最終做了什麼。任何評論這可能會或可能不會工作,將不勝感激! – olli 2013-05-14 18:07:14