MyErrorHandler.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. App::uses('ErrorHandler', 'Error');
  3. App::uses('CakeRequest', 'Network');
  4. class MyErrorHandler extends ErrorHandler {
  5. /**
  6. * override core one with the following enhancements/fixes:
  7. * - 404s log to a different domain
  8. * - IP, Referer and Browser-Infos are added for better error debugging/tracing
  9. * 2011-12-21 ms
  10. */
  11. public static function handleException(Exception $exception) {
  12. $config = Configure::read('Exception');
  13. if (!empty($config['log'])) {
  14. $log = LOG_ERR;
  15. $message = sprintf("[%s] %s\n%s\n%s",
  16. get_class($exception),
  17. $exception->getMessage(),
  18. $exception->getTraceAsString(),
  19. self::traceDetails()
  20. );
  21. if (in_array(get_class($exception), array('MissingControllerException', 'MissingActionException', 'PrivateActionException', 'NotFoundException'))) {
  22. $log = '404';
  23. }
  24. CakeLog::write($log, $message);
  25. }
  26. $renderer = $config['renderer'];
  27. if ($renderer !== 'ExceptionRenderer') {
  28. list($plugin, $renderer) = pluginSplit($renderer, true);
  29. App::uses($renderer, $plugin . 'Error');
  30. }
  31. try {
  32. $error = new $renderer($exception);
  33. $error->render();
  34. } catch (Exception $e) {
  35. set_error_handler(Configure::read('Error.handler')); // Should be using configured ErrorHandler
  36. Configure::write('Error.trace', false); // trace is useless here since it's internal
  37. $message = sprintf("[%s] %s\n%s\n%s", // Keeping same message format
  38. get_class($e),
  39. $e->getMessage(),
  40. $e->getTraceAsString(),
  41. self::traceDetails()
  42. );
  43. trigger_error($message, E_USER_ERROR);
  44. }
  45. }
  46. /**
  47. * override core one with the following enhancements/fixes:
  48. * - 404s log to a different domain
  49. * - IP, Referer and Browser-Infos are added for better error debugging/tracing
  50. * 2011-12-21 ms
  51. */
  52. public static function handleError($code, $description, $file = null, $line = null, $context = null) {
  53. if (error_reporting() === 0) {
  54. return false;
  55. }
  56. $errorConfig = Configure::read('Error');
  57. list($error, $log) = self::mapErrorCode($code);
  58. $debug = Configure::read('debug');
  59. if ($debug) {
  60. $data = array(
  61. 'level' => $log,
  62. 'code' => $code,
  63. 'error' => $error,
  64. 'description' => $description,
  65. 'file' => $file,
  66. 'line' => $line,
  67. 'context' => $context,
  68. 'start' => 2,
  69. 'path' => Debugger::trimPath($file)
  70. );
  71. return Debugger::getInstance()->outputError($data);
  72. } else {
  73. $message = $error . ' (' . $code . '): ' . $description . ' in [' . $file . ', line ' . $line . ']';
  74. if (!empty($errorConfig['trace'])) {
  75. $trace = Debugger::trace(array('start' => 1, 'format' => 'log'));
  76. $message .= "\nTrace:\n" . $trace . "\n";
  77. $message .= self::traceDetails();
  78. }
  79. return CakeLog::write($log, $message);
  80. }
  81. }
  82. /**
  83. * append some more infos to better track down the error
  84. * @return string
  85. * 2011-12-21 ms
  86. */
  87. public static function traceDetails() {
  88. App::uses('CommonComponent', 'Tools.Controller/Component');
  89. $currentUrl = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : 'n/a';
  90. $refererUrl = CommonComponent::getReferer(); //Router::getRequest()->url().'
  91. App::uses('CakeSession', 'Model/Datasource');
  92. $uid = CakeSession::read('Auth.User.id');
  93. if (empty($uid)) {
  94. $uid = (!empty($_SESSION) && !empty($_SESSION['Auth']['User']['id'])) ? $_SESSION['Auth']['User']['id'] : null;
  95. }
  96. $data = array(
  97. @CakeRequest::clientIp(),
  98. $currentUrl.(!empty($refererUrl) ? (' ('.$refererUrl.')') : ''),
  99. $uid,
  100. env('HTTP_USER_AGENT')
  101. );
  102. return implode(' - ', $data);
  103. }
  104. }