Log de Acessos - Zend Framework 1

Nesse tutorial vou ensinar como criar um log de acessos, que registra em um arquivo de texto todos os acessos que fizeram ao site ou aplicação, gravando o IP e a URL acessada, utilizando Zend Framework 1.

Primeiramente crie um arquivo chamado log_access.log ou qualquer outro nome que você deseja, você pode usar o Notepad ++ para isso.

Como recomenda a própria Zend, vamos coloca-lo na pasta data/log, conforme imagem...

Log de Acessos Zend Framework 1

Após isso em seu Bootstrap da aplicação crie um método _init para registrar o seu plugin de Log de Acesso, e também crie outro método que irá tratar o log, setando o formato do log, que no nosso caso será em um arquivo de texto, e também setando o formato da data e hora, e por fim registramos o log...

Bootstrap.php


/**
 * Inicia os logs da aplicação
 */
protected function _initLogger() 
{ 
   $this->formatterWriterLogger('logger_access', 'log_access.log');

   $front = Zend_Controller_Front::getInstance();
   $front->registerPlugin(new Application_Plugin_LoggerAccess());
} 

/**
 * Defini e seta o formato que será escrito no arquivo de log, 
 * setando também o formato da data, 
 * e por fim registra o 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);

    // Instancia a classe Zend_Log
    $logger = new Zend_Log($writer);
    // Define o formato para as datas
    $logger->setTimestampFormat("d/m/Y H:i:s");
    // Registra o log
    Zend_Registry::set($loggerName, $logger);
}

O método formatterWriterLogger, é interessante pois com ele podemos formatar outros tipos de logs que nossa aplicação venha a ter, como logs de erros, logs de cadastros, entre outros.

Após isso precisamos criar nosso plugin, ele ficará na pasta application/plugins, crie um arquivo chamado LoggerAccess.php, sua estrutura ficará parecida com a imagem a baixo...

Log de Acessos Zend Framework 1

Insira o seguinte código...

LoggerAccess.php


/**
 * Grava os acessos do site no arquivo de log de acessos
 * será gravado o IP, a URL digitada, o nome do módulo, nome do controller e nome da action.
 * 
 * @author    Everson da luz
 * @copyright 
 * @version   1.0 
 */
class Application_Plugin_LoggerAccess extends Zend_Controller_Plugin_Abstract 
{
    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    {
        // Chama a função para pegar o IP
        $ip = $this->getIp($request);

        // Url do site, sem o procotolo HTTP
        $uri = $_SERVER['REQUEST_URI'];

        if ($uri != "/favicon.ico") {
            // Pega o log pelo seu nome registrado
            $logger = Zend_Registry::get('logger_access');
            // Escreve no arquivo de log, o segundo parâmetro referencia o tipo de log
            $logger->log(
                "IP: "         . $ip . ' - ' .
                "URL: "        . $uri . ' - ' .
                "MODULE: "     . $request->getModuleName() . ' - ' .
                "CONTROLLER: " . $request->getControllerName() . ' - ' .
                "ACTION: "     . $request->getActionName()
            ,Zend_Log::INFO);
        }
    }

    /**
     * Pega o IP
     * 
     * @param  type $request
     * @return string
     */
    private function getIp($request)
    {
        $ipaddress = '';

        if ($request->getServer('HTTP_CLIENT_IP')) {
            $ipaddress = $request->getServer('HTTP_CLIENT_IP');
        } else if ($request->getServer('HTTP_X_FORWARDED_FOR')) {
            $ipaddress = $request->getServer('HTTP_X_FORWARDED_FOR');
        } else if ($request->getServer('HTTP_X_FORWARDED')) {
            $ipaddress = $request->getServer('HTTP_X_FORWARDED');
        } else if ($request->getServer('HTTP_FORWARDED_FOR')) {
            $ipaddress = $request->getServer('HTTP_FORWARDED_FOR');
        } else if ($request->getServer('HTTP_FORWARDED')) {
            $ipaddress = $request->getServer('HTTP_FORWARDED');
        } else if ($request->getServer('REMOTE_ADDR')) {
            $ipaddress = $request->getServer('REMOTE_ADDR');
        } else {
            $ipaddress = 'UNKNOWN';
        }

        return $ipaddress;
    }
}

Feito isso cada vez que alguém acessar qualquer página de seu site será gravado no arquivo de log algo como...

28/06/2015 19:07:28 INFO: IP: 201.00.01.59 - URL: /site/index/index - MODULE: site - CONTROLLER: index - ACTION: index

Com isso você sempre terá um log de acessos para consultas futuras, pois nunca se sabe quando precisara verificar qual IP acessou determinada URL em tal horário.

Voltar para o topo