Como Gerar Logs de Execução com PHP

Como Gerar Logs de Execução com PHP

Logs de execução são muito úteis para “catalogar” o ciclo de execução de um programa. Cada ação executada pelo software é registrada em um arquivo, juntamente com a data e a hora do ocorrido.

Muitos programadores enchem a tela de echo e var_dump, para descobrir o que está ocorrendo no código. Isso não é totalmente errado, mas há alternativas melhores. Aliás, já vi gente esquecer de tirar var_dump antes de mandar o sistema pro ar. Resultado: todo mundo vendo o debug ao acessar o site…

Neste artigo vou mostrar como criar um simples sistema de logs usando PHP.

Como Um Arquivo de Logs Deve Ser

Um simples exemplo de um registro em um arquivo de log é o seguinte:

[2015-03-31 00:00:00] INFO: Executando ação X...

Bem simples. Nada especial.

O arquivo nada mais é do que um conjunto de registros, um por linha, que indicam a data e a hora em que um determinado evento ocorreu.

No exemplo acima, incluí o nível do log, que é representado pela palavra INFO. Nesse caso, é um log de Informação. Poderíamos ter outros níveis, como Avisos (Warning) e erros (Error).

Função Para Gerar Logs

Vou mostrar uma simples função para criação de logs.

Vamos considerar os três tipos (aqui chamo de níveis) de logs que citei antes aqui no artigo.

Vou chamar a função de logMsg. Ela aceita três parâmetros, mas apenas o primeiro é obrigatório.

O primeiro parâmetro é a mensagem do log. O segundo é o nível do log (pode ser info, que é o valor padrão, warning ou error). O terceiro parâmetro é o nome do arquivo onde o log será escrito. Por padrão, será escrito no arquivo main.log.

Vamos ao código, com os deviso comentários.

function logMsg( $msg, $level = 'info', $file = 'main.log' )
{
    // variável que vai armazenar o nível do log (INFO, WARNING ou ERROR)
    $levelStr = '';
 
    // verifica o nível do log
    switch ( $level )
    {
        case 'info':
            // nível de informação
            $levelStr = 'INFO';
            break;
 
        case 'warning':
            // nível de aviso
            $levelStr = 'WARNING';
            break;
 
        case 'error':
            // nível de erro
            $levelStr = 'ERROR';
            break;
    }
 
    // data atual
    $date = date( 'Y-m-d H:i:s' );
 
    // formata a mensagem do log
    // 1o: data atual
    // 2o: nível da mensagem (INFO, WARNING ou ERROR)
    // 3o: a mensagem propriamente dita
    // 4o: uma quebra de linha
    $msg = sprintf( "[%s] [%s]: %s%s", $date, $levelStr, $msg, PHP_EOL );
 
    // escreve o log no arquivo
    // é necessário usar FILE_APPEND para que a mensagem seja escrita no final do arquivo, preservando o conteúdo antigo do arquivo
    file_put_contents( $file, $msg, FILE_APPEND );
}

Como Usar A Função de Geração de Logs

Para usar a função logMsg que criamos, basta chamá-la com, pelo menos, o primeiro parâmetro.

Vamos a alguns exemplos.

Geração de Log de Informação

Para gerar um simples log de informação, use o seguinte exemplo.

logMsg( "Executando a tarefa X..." );

Isso vai gerar a seguinte linha no arquivo de log

[2015-04-03 22:07:03] [INFO]: Executando a tarefa X...

Geração de Log de Aviso

Para gerar um log de aviso, use o seguinte exemplo.

logMsg( "Isto é um aviso.... a operação X pode falhar...", 'warning' );

Isso vai gerar a seguinte linha no arquivo de log

[2015-04-03 22:0703] [WARNING]: Isto é um aviso.... a operação X pode falhar...

Geração de Log de Erro

Para gerar um log de erro, use o seguinte exemplo.

logMsg( "Isto é um erro. A operação X falhou", 'error' );

Isso vai gerar a seguinte linha no arquivo de log

[2015-04-03 22:0703] [ERROR]: Isto é um erro. A operação X falhou

Por Que Não Usei a Função error_log do PHP

O PHP possui a função error_log. Você é livre para usá-la, se desejar.

Eu preferi não usá-la pois ela não permite usar as configurações a mais que acho úteis, como o nível de log. Ela é mais focada em erros, como o próprio nome da mensagem sugere.

Cuidado Com a Quantidade de Logs

Logs são muito úteis, claro. Mas existe um custo para o servidor.

Cada escrita no arquivo toma tempo da CPU e deixa sua aplicação um pouco mais lenta. É pouco perceptível quando há poucos logs.

Porém, se você configurar muitas gerações de logs, verá uma queda no desempenho. Principalmente se seu sistema receber muitos acessos simultâneos. Afinal, escrita em disco é uma das tarefas mais custosas para a CPU.

Por isso, use os logs com cautela. Gere logs apenas quando realmente necessário. Não crie logs inúteis. E, se gerar logs apenas para debug durante o desenvolvimento, lembre-se de removê-los antes de colocar a aplicação em produção.

Padrão PSR-3 de Logs

O grupo PHP-Fig criou, dentre outras recomendações, o PSR-3, que é uma recomendação de padronização para bibliotecas de geração de logs.

Se você já tem conhecimentos sobre Orientação a Objetos, recomendo analisar o PSR-3 e tentar aplicar em seus projetos. Se ainda não conhecer OOP, vá com calma. Use a função que mostrei nesse post e, depois, quando já tiver domínio de OOP, aplique os conceitos do PSR-3.

 

The following two tabs change content below.
Graduado em Ciência da Computação, pela Universidade Federal do Paraná (UFPR), é desenvolvedor de software desde 2008, com foco em Desenvolvimento Web com PHP.