22

日志的5个级别

 5 years ago
source link: http://www.infoq.com/cn/articles/five-levels-of-logging?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文最初发布于aib42个人网站,经原作者授权由InfoQ中文站翻译并分享。

日志记录是软件开发的一个概念,几乎所有(可能并不是所有)软件都能从日志记录中获得很多好处。在开始一个大项目时,日志记录通常是我第一个要搭建的子系统。关于它的好处,我可以说出一大堆,但我想把这个机会留给其他人(或者哪一天我想说了再说)。现在,我想说一说日志级别。

日志级别是对基本的“滚动文本”式日志记录的一个重要补充。每条日志消息都会基于其重要性或严重程度分配到一个日志级别。例如,“你的电脑着火了”是一个非常重要的消息,而“无法找到配置文件”的重要等级可能就低一些。

很多应用程序和库会根据自己或用户的需求定义自己的日志级别(参考文末的“外部例子”了解这方面的内容)。当然,并没有一种约定俗成的方法来做这件事,想怎么做都是可以的,但我想要说说我认为的最重要的五个(或者六个,或者四个)日志级别,它们应该是你自定义日志级别的基础。

我还将讨论给这些级别分配的颜色(或者说风格),因为带有不同颜色(或风格)的日志更容易追踪。如果采用了这样的系统,就可以很容易检查你的程序状态,就算没有受过训练的人也可以轻易分辨。谁知道呢,你可能留下电脑跑去吃午饭了,如果出现问题只能找别人来查看日志。

Error

错误已经发生了,这是毫无疑问的。错误的来源可能是在外部,但不管怎样都需要看一下是怎么回事。

可以用这个级别来表示需要引起人们注意(大多数时候需要采取行动)的错误。大多数难以优雅处理的异常都属于Error范畴。

风格:能引起人们注意的东西。我使用红色文本来表示(我的终端背景是黑色的)。

例子:

  • 无法找到"crucial.dat"文件
  • 错误的处理数据:<Exception>[堆栈追踪或后续的调试消息]
  • <Exception>在连接数据库时

Warn

错误有可能已经发生了。我只是一条日志消息,无法分析到底发生了什么,或许需要其他人来看看是不是有问题。

这可能是一个平行空间里的错误。它可能是当前或未来潜在问题(比如响应速度慢、连接断开、内存吃紧等等)的预兆,也可能是程序在处理某些任务时出现错误(但可能不一会再发生类似的情况)。

风格:能引起人们注意但又不会让人感到厌烦的风格,以免你在解决其他问题时没空来处理这些错误。与Error的风格不同,我使用黄色的文本来表示Warn。

例子:

  • 连接关闭,在2秒后重新连接
  • 无法找到"logging.conf"[在配置文件中指定的],回到默认配置
  • 30秒后尝试连接超时
  • 出现FileVersionTooOldException异常,回到Version12Parser

Info

通知用户一个操作或状态发生了变化。别紧张,继续手头的活。

Info可以说是(一般的非技术)用户可以接触到的最“啰嗦”的日志级别。如果有人把它们大声念给你听,你也不会介意,这是你最乐于见到的日志记录。它不会包含很多技术细节,可能只包含普通用户会关注的信息(比如文件名等)。

风格:可以和背景颜色区分开来,我使用白色文本。

例子:

  • 代理初始化完毕
  • 加载存档"yeti02"
  • 进入高速模式
  • 当前目录是"/tmp"
  • 上行线路已建立
  • 渲染完成,耗时42.999秒

Debug

如果你能读懂这个级别的日志,那么你离程序已经很近了。

这就是为什么你需要保存日志文件,在修复bug时需要这些日志。这是开发人员最关心的内容。

在转储程序运行流程和其他技术问题时,应该使用Debug级别的日志。除非日志太多了(在这种情况下使用Trace级别更合适)或者更适合使用更高级别的日志,否则Debug日志是非常值得保留的,毕竟是你自己在代码中记录这些日志的。如果和其他的Debug或更高级别的消息重叠,而且没有包含更多的信息,那么可以考虑将其删除。

风格:可以很容易就忽略的风格。我使用浅灰色或米黄色文本,也就是我的终端的默认文本颜色。

例子:

  • 从"/etc/octarine/octarine.conf"读取配置
  • 使用"/home/aib/.octarinerc"覆盖配置
  • 分析完成,创建图…
  • 作为”user”连接到服务器:4242
  • 发送两条消息
  • 渲染时故障:
  • Foo 0.990秒
  • Bar 42.009秒

Trace

这些技术细节可能与程序不是很相干,除非你正好需要它们。

Trace的信息是更加具体的调试信息,你可能并不想看到它(除非你向保存日志的人卖硬盘的时候需要)。它会包含比如说调用了什么函数(函数名),或是和客户端交换了什么网络包等内容。它善于找到一些低级错误,但通常你可以在调试消息中缩小范围,找到问题。

大多数Trace消息包含了你已经知道的信息(Debug消息中说了是“登录”,所以这肯定是登录相关的数据包),所以可能对你不是很有用,除非你的假设是错误的。(”它会不会是登出消息?!“、”这里应该调用foo。为什么foo的Trace信息没有打印出来呢?”)

风格:使用比Debug消息更加不显眼的风格。我使用深灰色,通常用来表示禁用的颜色。

例子:

  • 调用参数("baz", "bar", 42)函数”foo”
  • ->GET / HTTP/1.1\nHost: localhost\n\n
  • 收到: <?xml version="1.0" encoding="UTF-8" ?>\n<ohboy>\n [...]

Fatal

发生了一个致命错误,我们要退出了。祝你好运!

它应该比Error更严重,但使用它的频率比Trace还少,所以我把它放在文章的最后。顾名思义,致命错误表示这种情况的发生将导致程序无法继续运行。因此,给它们专门设置一个级别没什么意义。但是致命的错误也可能是常见和可恢复的(比如重启就能解决),因此仍然值得一提。

风格:如果你想不出其他样式的话,可以选择比Error更显眼的风格。我使用紫色文本,从远处看的话和Error的红色文本相近,但近看就不一样。

例子:

  • 内存不足
  • 无法分配65536字节的磁盘空间
  • 许可过期,切换到免费软件模式

外部例子

任何成熟的日志记录API或库都应该有自己的日志级别(可能支持用户自定义)。以下是广泛使用的库,仅供参考:

查看英文原文: https://www.aib42.net/article/five-levels-of-logging

感谢无明对本文的审校。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK