Trilhas
/
Elixir
Elixir
/
Exercícios
/
Nível de log
Nível de log

Nível de log

Exercício de aprendizagem

Introdução

Átomos

O tipo atom do Elixir representa uma constante fixa. O valor de um átomo é simplesmente o próprio nome. Isso nos dá uma forma de interagir com dados com segurança de tipos. Os átomos podem ser definidos da seguinte forma:

# All atoms are preceded with a ':' then follow with alphanumeric snake-cased characters
variable = :an_atom

Átomos são representados internamente por um número inteiro em uma tabela de consulta, que são definidos automaticamente. Não é possível alterar esse valor interno.

Cond

Muitas vezes, queremos escrever código que pode ramificar com base em uma condição. Embora existam muitas formas de fazer isso no Elixir, uma das mais simples é usar cond/1.

Na sua forma mais simples, cond segue o primeiro caminho que avalia para true, com um ou mais blocos:

cond do
  x > 10 -> :this_might_be_the_way
  y < 7 -> :or_that_might_be_the_way
  true -> :this_is_the_default_way
end

Se nenhum caminho avaliar para true, o runtime gera um erro.

Instruções

Você está executando um sistema composto por algumas aplicações que produzem muitos logs. Você quer escrever um pequeno programa que agregue esses logs e lhes dê rótulos de acordo com seu nível de gravidade. Todas as aplicações do seu sistema usam os mesmos códigos de log, mas algumas aplicações legadas não suportam todos os códigos.

Código do log Rótulo do log Suportado em aplicações legadas?
0 trace não
1 debug sim
2 info sim
3 warning sim
4 error sim
5 fatal não
outro / não suportado unknown -

1. Determine o rótulo do log

Implemente a função LogLevel.to_label/2. Ela deve receber um código inteiro e um sinalizador Boolean que indica se o log vem de uma aplicação legada, e retornar o rótulo de uma linha de log como um átomo.

Códigos de log não especificados na tabela devem retornar o rótulo unknown. Códigos de log especificados na tabela como não suportados em aplicações legadas também devem retornar o rótulo unknown se o log vier de uma aplicação legada.

LogLevel.to_label(0, false)
# => :trace

LogLevel.to_label(0, true)
# => :unknown

2. Envie um alerta

Alguém precisa ser notificado quando coisas inesperadas acontecem.

Implemente a função LogLevel.alert_recipient/2 para determinar para quem o alerta precisa ser enviado. A função deve receber um código inteiro e um sinalizador Boolean que indica se o log vem de uma aplicação legada, e retornar o nome do destinatário como um átomo.

Use a função LogLevel.to_label/2 da tarefa anterior. Se o rótulo do log for error ou fatal, envie o alerta para a equipe ops. Se você receber um log com o rótulo unknown de um sistema legado, envie o alerta para a equipe dev1; outros rótulos unknown devem ser enviados para a equipe dev2. Todos os outros rótulos de log podem ser ignorados com segurança retornando false.

LogLevel.alert_recipient(-1, true)
# => :dev1

LogLevel.alert_recipient(0, false)
# => false
Editar via GitHub O link abre em uma nova janela ou aba
Elixir Exercism

Tudo pronto para começar Nível de log?

Crie sua conta no Exercism para aprender e dominar Elixir com 58 conceitos168 exercícios e mentoria humana de verdade, tudo de graça.