Percursos
/
Ruby
Ruby
/
Exercícios
/
Analisador de linhas de log
Analisador de linhas de log

Analisador de linhas de log

Exercício de aprendizagem

Introdução

Tal como tudo em Ruby, uma String é um objeto. As strings são compostas por uma sequência arbitrária de bytes (normalmente carateres) e são inicializadas e manipuladas como qualquer outro objeto. Na verdade, uma das coisas mais úteis do Ruby é a quantidade de métodos que podes chamar em strings (e noutros objetos) para te poupar muito tempo a escrever código. Neste exercício vamos explorar e brincar com alguns desses métodos auxiliares.

Criar uma string

Embora possas usar String.new(...) para criar uma string, é muito mais comum usar um literal. Há muitos literais diferentes que podes usar, e dividem-se em duas categorias: os que permitem interpolação e os que não permitem.

Os literais mais comuns são as aspas simples e as aspas duplas ('...' e "..."). As aspas simples não permitem interpolação, mas as aspas duplas permitem. A interpolação acontece quando incluímos uma string dentro de outra usando a sintaxe #{}.

# Use single quotes when not interpolated
location = 'World'

# And double quotes when interpolated
puts "Hello, #{location}!"   #=> "Hello, World!"

Também podes usar outros literais, como %{... } para strings interpoladas e %q{...} para strings não interpoladas. São úteis se as tuas strings contiverem os carateres ' ou ".

Nota: não há nenhuma regra absoluta que diga que tens de usar strings não interpoladas se a tua string não contiver interpolação.

Interagir com strings

É útil pensar nas strings em Ruby de forma semelhante à forma como pensas nos arrays. Têm um tamanho e os seus carateres estão indexados (com 0 como primeiro índice):

my_string = "Some string"

my_string.size   #=> 11

my_string[0]    #=> 'S'
my_string[1]    #=> 'o'
my_string[-1]   #=> 'g'

# Find the first index of a character
my_string.index('m')   #=> 2

Podemos extrair partes de strings usando índices ou slice:

my_string = "Some string"

# Find three characters starting with the second character (index 1)
my_string[1, 3]         #=> "ome"
my_string.slice(1, 3)   #=> "ome"

Os valores semânticos das strings também podem ser manipulados. Vale a pena explorar a documentação do Ruby para conheceres todos os métodos, mas aqui ficam alguns exemplos de uso comum:

"hello".capitalize   #=> "Hello"
"HELLO".downcase     #=> "hello"
"hello".center(9)    #=> "  hello  "
"  hello  ".strip    #=> "hello"

"hello world".split(" ")   #=> ["hello", "world"]

Também podes usar métodos como gsub para substituir carateres:

# Replace one character with another
"noob".gsub("o","0")   #=> "n00b"

# (Advanced) Replace a regular expression
"Ruby really rocks".gsub(/[aieou]/,'')   #=> "Rby rlly rcks"

Em todos os exemplos acima, é devolvida uma nova String. No entanto, muitos métodos têm equivalentes que terminam em ! e que modificam a própria string.

# Use normal methods to return new strings
my_string = "hello"
my_string.capitalize   #=> "Hello"
puts my_string         #=> "hello"

# And bang-methods (...!) to modify the object
my_string = "hello"
my_string.capitalize!  #=> "Hello"
puts my_string         #=> "Hello"

Instruções

Neste exercício vais processar linhas de registo.

Cada linha de registo é uma string com o seguinte formato: "[<LEVEL>]: <MESSAGE>".

Existem três níveis de registo diferentes:

  • INFO
  • WARNING
  • ERROR

Tens três tarefas, e cada uma recebe uma linha de registo e pede-te que faças algo com ela. Há muitas formas de resolver estas tarefas: escolhe os teus métodos preferidos dos exemplos acima e vê o que consegues arranjar.

1. Obter a mensagem de uma linha de registo

Implementa o método LogLineParser#message para devolver a mensagem de uma linha de registo:

LogLineParser.new('[ERROR]: Invalid operation').message
# => "Invalid operation"

Qualquer espaço em branco no início ou no fim deve ser removido:

LogLineParser.new("[WARNING]:  Disk almost full\r\n").message
# => "Disk almost full"

2. Obter o nível de registo de uma linha de registo

Implementa o método LogLineParser#log_level para devolver o nível de registo de uma linha de registo, que deve ser devolvido em minúsculas:

LogLineParser.new('[ERROR]: Invalid operation').log_level
# => "error"

3. Reformatação de uma linha de registo

Implementa o método LogLineParser#reformat, que reformata a linha de registo, colocando a mensagem primeiro e o nível de registo depois, entre parênteses:

LogLineParser.new('[INFO]: Operation completed').reformat
# => "Operation completed (info)"
Editar via GitHub A ligação abre numa nova janela ou separador
Ruby Exercism

Estás pronto para começar Analisador de linhas de log?

Inscreve-te no Exercism para aprenderes e dominares Ruby com 21 conceitos121 exercícios, e mentoria humana real, tudo grátis.