2013-02-28 2 views
3

В dev env предупреждения улавливаются symfony ErrorHandler, что хорошо. В prod env symfony игнорирует предупреждения, и я получаю их только в журнале ошибок php. Теперь я хочу, чтобы эти ошибки также регистрировались.Предупреждения и уведомления о регистрации в Symfony 2

Обезжиривание уровня журнала не сработало, так как эти ошибки не обрабатываются вообще. Итак, как я могу регистрировать эти ошибки в среде Symfony prod?

Я использую Symfony 2.0

Edit: Хорошо, я вижу, есть даже не обработчик ошибок, когда не в режиме отладки (Kernel.php):

if ($this->debug) { 
     ini_set('display_errors', 1); 
     error_reporting(-1); 

     DebugUniversalClassLoader::enable(); 
     ErrorHandler::register(); 
     if ('cli' !== php_sapi_name()) { 
      ExceptionHandler::register(); 
     } 
} else { 
    ini_set('display_errors', 0); 
} 

Так что это лучший способ реализовать это без работы с каркасом?

+0

Вы уверены, что нет журналов? Вы смотрели 'файлы app/logs/prod.log'? – Hast

+0

Да, я проверил его. – Johni

+1

Вы говорите о уровне ведения журнала «предупреждение» или о предупреждениях, брошенных php? – Sgoettschkes

ответ

0

Вам нужно будет настроить свою среду для этого, указав ядру работать в режиме отладки.

new AppKernel('prod', true); 

Важны, но не связанные с темой окружающей среды является ложным ключом в строке 8 переднего контроллер выше. Это указывает, должно ли приложение работать в режиме «отладки». Независимо от среды , приложение Symfony2 может быть запущено с режимом отладки, установленным на true или false. Это влияет на многие вещи в приложении, например , должны ли отображаться ошибки или если файлы кэша динамически перестраиваются по каждому запросу. Хотя это и не является требованием, для режима отладки обычно установлено значение true для тестовых сред dev и для среды prod.

http://symfony.com/doc/2.0/cookbook/configuration/environments.html

+0

Да, я знаю, что он включен в режиме отладки, который отлично подходит для разработки. Но основная причина заключается в том, чтобы найти скрытые ошибки, пока сайт zthe жив, а журнал ошибок php иногда не имеет достаточной информации, и я думаю, что лучше всего объединить все записи. – Johni

+0

Вправо. Вам нужно создать настраиваемую среду под названием «prod_custom» или что-то еще, и создать файл app_prod_custom.php в качестве точки входа с помощью нового AppKernel ('prod_custom', true); '. Отладка HAS должна быть включена в ядре для Symfony, чтобы справиться с этим, если вы не хотите взломать источник и не сможете обновить пакеты поставщиков Symfony. –

+0

Не разрешен режим отладки. – Johni

2

Вы можете сделать это путем реализации пользовательских ErrorHandler и переопределение некоторых AppKernel методов. Например:

class AppKernel 
{ 
    protected $prodErrorHandler; 
    public function init() 
    { 
     if ($this->debug) { 
      ini_set('display_errors', 1); 
      error_reporting(-1); 

      DebugUniversalClassLoader::enable(); 
      ErrorHandler::register(); 
      if ('cli' !== php_sapi_name()) { 
       ExceptionHandler::register(); 
      } 
     } else { 
      ini_set('display_errors', 0); 
      error_reporting(-1); 
      $this->prodErrorHandler = new CustomErrorHandler(); 
      set_error_handler(array($this->prodErrorHandler, 'handle')); 
     } 
    } 
    public function boot() 
    { 
     $booted = $this->booted; 
     parent::boot(); 
     if (!$booted && $this->prodErrorHandler !== null && $this->container->has('logger')) { 
      $this->prodErrorHandler->setLogger($this->container->get('logger')); 
     } 
    } 
    // ... other methods 
} 
class CustomErrorHandler 
{ 
    protected $logger; 
    protected $buffer = array(); 
    public function setLogger($logger) 
    { 
     $this->logger = $logger; 
     foreach ($this->buffer as $error) { 
      $this->logger->warning($error); 
     } 
     $this->buffer = array(); 
    } 
    public function handle($level, $message, $file, $line, $context) 
    { 
     if (error_reporting() & $level) { 
      $error = new \ErrorException(sprintf('%s: %s in %s line %d', isset($this->levels[$level]) ? $this->levels[$level] : $level, $message, $file, $line)); 
      if ($this->logger !== null) { 
       $this->logger->warning($error); 
      } else { 
       $this->buffer[] = $error; 
      } 
      return true; // this would skip logging to file etc. Return false to just log and pass error handling to other handlers 
     } else { 
      return false; 
     } 
    } 
} 

Нечто подобное можно сделать с отдельным Bundle тоже, но он может «пропустить» некоторые ошибки произошли до регистрации пакета.

Если вы используете Monolog 1.6 или новее, вы также можете использовать Monolog\ErrorHandler для регистрации регистратора на наличие ошибок, необработанных исключений и фатальных ошибок.

+0

Хорошая идея. Спасибо! – ZhukV

+0

Для решения \ Monolog \ ErrorHandler добавьте следующее в свой AppKernel. К сожалению, из-за необходимости извлекать регистратор из контейнера, это не вступает в силу до Kernel-> boot(). Это означает, что существует большое окно времени, в течение которого любые уведомления/предупреждения/ошибки, возникающие при инициализации пакетов и т. Д., Не регистрируются. IMO - это огромная миссия с Symfony2 - правильные обработчики ошибок/исключений должны быть инициализированы на ранней стадии. 'public function boot() { parent :: boot(); $ logger = $ this-> container-> get ('logger'); \ Monolog \ ErrorHandler :: register ($ logger); } ' – 2014-03-18 02:10:17

Смежные вопросы