Logging com Ruby

A classe Logger da biblioteca padrão do Ruby ajuda a escrever mensagens de log para um arquivo ou para um stream de dados. Ela suporta rolagem dos arquivos de log por tempo ou baseada em tamanho. Às mensagens podem ser associados níveis de gravidade e apenas as mensagens em um determinado nivel ou acima do nível atual do logger serão armazenadas, isto é, “logadas”.

Quando você escreve um código, você simplesmente assume que todas as mensagens serão logadas. Em tempo de execução, você pode obter um log mais ou menos verboso mudando o nível do log. Uma aplicação em produção geralmente tem um nível de log Logger:INFO ou Logger:WARN. Do menos ao mais severo, os métodos são Logger.debug, Logger.info, Logger.warn, Logger.error e Logger.fatal.

O nível de log DEBUG é útil para diagnosticar uma tarefa passo a passo. O nível ERROR é geralmente usado quando se lida com o tratamento de exceções: se o programa não consegue resolver um problema, ele loga a exceção ao invés de parar sua execução e esperar que um administrador cuide do problema. O nível FATAL deve apenas ser usado quando um programa não pode se recuperar de algum problema, e está prestes a travar ou finalizar.

Se seu log está sendo armazenado em um arquivo, você pode ter o Logger rotacionado ou substituído quando ele se torna muito grande, ou uma vez que uma certa quantidade de tempo passou:

1   require 'logger'
2   # Mantenha os dados apenas para o mês atual
3   Logger.new('este_mes_.log', 'monthly')
4   # Mantenha os dados de hoje e para os proximos 20 dias
5   Logger.new('application.log', 20, 'daily')
6   # Reinicia o logger assim que o arquivo completar 100 megabytes
7   Logger.new('application.log', 0, 100 * 1024 * 1024)

O código abaixo, usa o logger da aplicação para imprimir uma mensagem de debugging e, em um nível mais alto de severidade, como parte do código de tratamento de erro.

 1   #logex.rb
 2   require 'logger'
 3   $LOG = Logger.new('log_file.log', 'monthly')
 4   def divide(numerador, denominador)
 5     $LOG.debug("Numerator: #{numerador}, denominador #{denominador}")
 6     begin
 7       result = numerador / denominador
 8     rescue Exception => e
 9       $LOG.error "Erro na divisão!: #{e}"
10       resultado = nil
11     end
12     return resultado
13   end
14   divide(10, 2)

O conteúdo do arquivo log_file.log é:

1   # Logfile created on Tue Mar 18 17:09:29 +0530 2008 by /
2   D, [2008-03-18T17:09:29.216000 #2020] DEBUG -- : Numerador: 10, denominador 2

Agora tente chamar o método assim:

1   divide(10, 0)

O conteúdo do arquivo log_file.log é:

1   # Logfile created on Tue Mar 18 17:09:29 +0530 2008 by /
2   D, [2008-03-18T17:09:29.216000 #2020] DEBUG -- : Numerador: 10, denominador 2
3   D, [2008-03-18T17:13:50.044000 #2820] DEBUG -- : Numerador: 10, denominador 0
4   E, [2008-03-18T17:13:50.044000 #2820] ERROR -- : Erro na divisião!: divided by 0

Para alterar o nível do log, simplesmente associe a constante apropriada a level:

1   $LOG.level = Logger::ERROR

Agora nosso logger ignorará todas as mensagens de log exceto as com nível de severidade ERROR ou FATAL. O conteúdo do arquivo log_file.log é:

1   E, [2008-03-18T17:15:59.919000 #2624] ERROR -- : Erro na divisão!: divided by 0

Logo do Guru-SP

Este material tem como base o tutorial do RubyLearning.com de Satish Talim e foi traduzido por membros do GURU-SP com a permissão do autor.

Ajude o RubyLearning participando em algum dos cursos pagos ou fazendo uma doação para o projeto

Voltar para o índice