Nesse tutorial vou demonstrar como criar um log de erros, que registra em um arquivo de texto todos os erros gerados pela aplicação, utilizando Zend Framework 1.
Primeiramente vamos criar um controller de erros, que vai gerenciar qualquer erro da aplicação, e dispachar o erro para sua view. Então crie um controller em seu modulo ou direto na aplicação, chamado ErrorController.php, e coloque o seguinte código...
ErrorController.php
<?php
class ErrorController extends Zend_Controller_Action
{
public function errorAction()
{
$errors = $this->_getParam('error_handler');
if(!$errors) {
$this->view->message = 'A página que você<br />está procurando não existe!';
return;
} else {
switch ($errors->type){
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
// 404 error -- controller or action not found
$this->getResponse()->setHttpResponseCode(404);
$priority = Zend_Log::NOTICE;
$this->view->message = '404 Oops!<br />Página não encontrada!';
break;
default:
// application error
$this->getResponse()->setHttpResponseCode(500);
$priority = Zend_Log::CRIT;
$this->view->message = 'Error 500!<br />Houve um erro na aplicação!';
break;
}
// Grava os erros no arquivo de log
$this->recordsLog($errors, $priority);
// Conditionally display exceptions
if ($this->getInvokeArg('displayExceptions') == true) {
$this->view->exception = $errors->exception;
}
$this->view->request = $errors->request;
}
}
/**
* Grava os erros no arquivo de log.
*
* @param array $errors parametro url contendo os erros
* @param inteiro $priority tipo de erro
*/
private function recordsLog($errors, $priority)
{
$logger = Zend_Registry::get('logger_error');
$params = $errors->request->getParams();
$paramsString = "array (\n";
foreach($params as $key=>$value) {
$paramsString .= "'".$key."' => '".$value."'\n";
}
$paramsString .= ")\n";
$logger->log(
"ERROR = ".$this->view->message."\n"
."MESSAGE = ".$errors->exception->getMessage()."\n"
."STACK TRACE = \n".$errors->exception->getTraceAsString()."\n"
."REQUEST PARAMS = ".$paramsString
, $priority);
}
}
Após isso, crie a view correspondente a action error, que deverá ficar em seu diretório de views, com o seguinte código...
error.phtml
<h1><?php echo $this->message ?></h1>
<?php if (isset($this->exception)): ?>
<h2>Exception information:</h2>
<p><strong>Message:</strong> <?php echo $this->exception->getMessage() ?></p>
<h2>Stack trace:</h2>
<pre><?php echo $this->exception->getTraceAsString() ?></pre>
<h2>Request Parameters:</h2>
<pre><?php echo $this->escape(var_export($this->request->getParams(), true)) ?></pre>
<?php endif ?>
Essa view será responsável por exibir o erro na tela.
O próximo passo é definir qual será o module, controller e view que irão manipular os erros da aplicação. Para isso em seu bootstrap da aplicação defina esses manipuladores, e também usaremos o método formatterWriterLogger que utilizamos no tutorial de erros Log de acessos Zend Framework 1, esse método irá definir o formato de log e também o seu diretório, conforme código a baixo...
Bootstrap.php
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
/**
* Defini o caminho para exibir a página de erros
*/
protected function _initErrorHandlers()
{
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(array(
'module' => $front->getDefaultModule(),
'controller' => 'error',
'action' => 'error'
)));
}
/**
* Inicia os logs da aplicação
*/
protected function _initLogger()
{
$this->formatterWriterLogger('logger_error', 'log_error.log');
}
/**
* Defini e seta o formato que será escrito no arquivo de log,
* setando também o formato da data,
* e por fim registra o nome do log.
*
* @param string $loggerName Nome do log a ser registrado
* @param string $loggerFile Nome do arquvio de log, onde será gravado
*/
private function formatterWriterLogger($loggerName, $loggerFile)
{
// Defini o tipo de escritor, setando o caminho do arquivo de log
$writer = new Zend_Log_Writer_Stream(APPLICATION_PATH . '/../data/logs/' . $loggerFile);
// Define o formato que será gravado o log
$format = '%timestamp% %priorityName%: %message%' . PHP_EOL;
$formatter = new Zend_Log_Formatter_Simple($format);
$writer->setFormatter($formatter);
// Cria o objeto do log
$logger = new Zend_Log($writer);
// Define o tipo de formato para as datas
$logger->setTimestampFormat("d/m/Y H:i:s");
// Registra o nome do log
Zend_Registry::set($loggerName, $logger);
}
}
Pronto! A única coisa que falta agora é criar um arquivo chamado log_error.log, e colocá-lo no diretório /data/logs/ conforme recomendado pela própria Zend. Nesse arquivo ficará salvo todos os erros que ocorrerão, tanto erros de páginas não encontradas quanto erros fatais de programação.
A sua estrutura de diretórios final ficará semelhante a isso...