轨道
/
Elixir
Elixir
/
练习
/
日志级别
日志级别

日志级别

学习练习

简介

原子

Elixir 的atom类型表示一个固定的常量。原子的值就是它自己的名字。这为我们提供了一种类型安全的方式来操作数据。可以这样定义原子:

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

_原子_在内部以整数形式存储在查找表中,这些整数是自动设置的。这个内部值无法更改。

Cond

我们经常需要编写根据条件分支的代码。在 Elixir 中实现这一点有很多方式,但最简单的一种是使用cond/1。

最简单的情况下,cond会走第一个求值为true的路径,可以有一个或多个分支:

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

如果没有任何路径求值为true,运行时就会抛出错误。

说明

你正在运行一个系统,它由若干个会产生大量日志的应用组成。你想写一个小程序,把这些日志汇总起来,并按严重程度给它们打上标签。系统中所有应用使用相同的日志代码,但一些旧版应用并不支持全部代码。

日志代码 日志标签 旧版应用是否支持?
0 trace 否
1 debug 是
2 info 是
3 warning 是
4 error 是
5 fatal 否
其他 / 不支持 unknown -

1. 确定日志标签

实现LogLevel.to_label/2函数。它接收一个整数代码和一个布尔标志,用来表明该日志是否来自旧版应用,并以原子形式返回日志行的标签。

表中未列出的日志代码应返回 unknown 标签。表中标注为旧版应用不支持的日志代码,如果日志来自旧版应用,也应返回 unknown 标签。

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

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

2. 发送警报

发生意外情况时,总得有人收到通知。

实现LogLevel.alert_recipient/2函数,确定警报需要发送给谁。该函数接收一个整数代码和一个布尔标志,用来表明该日志是否来自旧版应用,并以原子形式返回接收者的名字。

使用上一个任务中的LogLevel.to_label/2函数。如果日志标签是 error 或 fatal,就把警报发送给 ops 团队。如果收到来自旧版系统、标签为 unknown 的日志,就把警报发送给 dev1 团队;其他 unknown 标签应发送给 dev2 团队。其余所有日志标签都可以安全忽略,返回 false 即可。

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

LogLevel.alert_recipient(0, false)
# => false
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Elixir Exercism

准备好开始 日志级别 了吗?

注册 Exercism,借助 58 个概念168 个练习 和真人导师指导,学习并掌握 Elixir,全部免费。