如何定义日志消息的级别?详解日志的5个级别

2018 年 9 月 25 日 高效开发运维
作者 | aib42
译者 | 刘嘉洋,无明
日志级别如何划分?

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

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

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

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

   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 \n [...]

   Fatal  

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

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

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

例子

  • 内存不足

  • 无法分配 65536 字节的磁盘空间

  • 许可过期,切换到免费软件模式

外部例子

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

  • Linux 的 printk(https://en.wikipedia.org/wiki/Printk#Logging_Levels)

  • Python 的 logging(https://docs.python.org/library/logging.html#logging-levels)

  • Java 的 java.util.logging.Level(https://docs.oracle.com/javase/6/docs/api/java/util/logging/Level.html)或 log4j 的 org.apache.log4j.Level(https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Level.html)

  • JavaScript 的 console.level 调用(WHATWG 或 Node.js 的 Console API 规范)

  • NLog 的日志级别(https://github.com/nlog/nlog/wiki/Log-levels)

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


活动推荐

微服务架构提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。企业转型微服务,有哪些技术需要调整?业界有哪些最佳实践?大企业在实践微服务中如何成长?

InfoQ 主办的第四届 CNUTCon 全球运维技术大会,邀请了 Twitter、RIOT Games、BAT 等国内外一线专家,分享智能时代下运维的新趋势、新思路、新技术和实战经验,包括探讨微服务的应用场景、企业集成架构的演进以及微服务转型思路和技术决策考虑等内容。

目前,大会 8 折限时优惠,立减 720 元,团购更优惠!扫描下方二维码或点击阅读原文了解,有任何问题欢迎咨询 Joy 小同学,电话:13269078023(微信同号)。

登录查看更多
1

相关内容

刘嘉,北京师范大学心理学部教授、国家杰青、长江学者特聘教授、国家“万人计划”科技创新领军人才。北京大学学士/硕士,美国麻省理工学院博士。国家杰出青年基金获得者、教育部长江学者特聘教授、国家“万人计划”科技创新领军人才。研究领域为视觉的认知神经机制。
最新《Deepfakes:创造与检测》2020综述论文,36页pdf
专知会员服务
62+阅读 · 2020年5月15日
《强化学习》简介小册,24页pdf
专知会员服务
272+阅读 · 2020年4月19日
【SIGMOD2020-腾讯】Web规模本体可扩展构建
专知会员服务
29+阅读 · 2020年4月12日
【WWW2020-微软】理解用户行为用于文档推荐
专知会员服务
35+阅读 · 2020年4月5日
【图神经网络(GNN)结构化数据分析】
专知会员服务
115+阅读 · 2020年3月22日
【2020新书】Kafka实战:Kafka in Action,209页pdf
专知会员服务
67+阅读 · 2020年3月9日
【Google】利用AUTOML实现加速感知神经网络设计
专知会员服务
29+阅读 · 2020年3月5日
模型压缩究竟在做什么?我们真的需要模型压缩么?
专知会员服务
27+阅读 · 2020年1月16日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
87+阅读 · 2019年11月25日
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
亿级订单数据的访问与存储,怎么实现与优化?
码农翻身
16+阅读 · 2019年4月17日
基于Web页面验证码机制漏洞的检测
FreeBuf
7+阅读 · 2019年3月15日
深度学习 | 免费使用Google Colab的GPU云计算平台
沈浩老师
12+阅读 · 2018年2月4日
AI都干过什么让人细思极恐的事?
全球创新论坛
4+阅读 · 2017年9月15日
有了场景和画像才懂用户
互联网er的早读课
6+阅读 · 2017年8月26日
详解TensorForce: 基于TensorFlow建立强化学习API
机械鸡
5+阅读 · 2017年7月22日
如何用Python做舆情时间序列可视化?
CocoaChina
11+阅读 · 2017年7月21日
Arxiv
5+阅读 · 2018年1月30日
VIP会员
相关VIP内容
最新《Deepfakes:创造与检测》2020综述论文,36页pdf
专知会员服务
62+阅读 · 2020年5月15日
《强化学习》简介小册,24页pdf
专知会员服务
272+阅读 · 2020年4月19日
【SIGMOD2020-腾讯】Web规模本体可扩展构建
专知会员服务
29+阅读 · 2020年4月12日
【WWW2020-微软】理解用户行为用于文档推荐
专知会员服务
35+阅读 · 2020年4月5日
【图神经网络(GNN)结构化数据分析】
专知会员服务
115+阅读 · 2020年3月22日
【2020新书】Kafka实战:Kafka in Action,209页pdf
专知会员服务
67+阅读 · 2020年3月9日
【Google】利用AUTOML实现加速感知神经网络设计
专知会员服务
29+阅读 · 2020年3月5日
模型压缩究竟在做什么?我们真的需要模型压缩么?
专知会员服务
27+阅读 · 2020年1月16日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
87+阅读 · 2019年11月25日
相关资讯
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
亿级订单数据的访问与存储,怎么实现与优化?
码农翻身
16+阅读 · 2019年4月17日
基于Web页面验证码机制漏洞的检测
FreeBuf
7+阅读 · 2019年3月15日
深度学习 | 免费使用Google Colab的GPU云计算平台
沈浩老师
12+阅读 · 2018年2月4日
AI都干过什么让人细思极恐的事?
全球创新论坛
4+阅读 · 2017年9月15日
有了场景和画像才懂用户
互联网er的早读课
6+阅读 · 2017年8月26日
详解TensorForce: 基于TensorFlow建立强化学习API
机械鸡
5+阅读 · 2017年7月22日
如何用Python做舆情时间序列可视化?
CocoaChina
11+阅读 · 2017年7月21日
Top
微信扫码咨询专知VIP会员