重视软件开发的黑匣子
2022 年 3 月 21 日,东航一架波音 737 客机在执行昆明——广州航班任务时,于梧州坠毁。机上人员共 132 人,其中旅客 123 人、机组 9 人,从 8000 多米的高空垂直坠落,生还的几率微乎其微,但人们仍然祈祷有奇迹发生!
谁也不知道,意外和明天哪个会提前到来!愿天堂没有意外;愿天堂没有奔波;愿天堂一切美好!
3 月 27 日,搜寻黑匣子的工作取得了重大进展,失事飞机上的两个个黑匣子已经找到。目前,黑匣子已被送往北京的民航专业机构进行译码。
本次坠毁的东航客机是波音 737-800 型号飞机,装有两个飞行记录器,也就是我们俗称的“黑匣子”,这是分析事故原因的关键。驾驶舱语音记录器安装在货仓尾部,在飞机通电时开始记录,断电后停止记录,可以记录四个通道声音,分别为机长通道、副驾驶通道、备用通道、环境声音通道,记录时长大约两到三小时左右。
另一个则是数据记录器,安装在客舱尾部,在发动机启动时开始记录,发动机停车后停止记录,记录时长达 25 小时左右,记录参数详尽约 1000 个左右。例如,高度、速度、航向、俯仰角、滚转角、垂直速度以及机组的操作如驾驶盘杆量、油门等重要参数。
作为飞机数据客观、真实、全面的记录者,黑匣子是飞机失事后查明事故原因的最可靠、最科学、最有效的手段。伴随着航空事业的发展,黑匣子在飞机日常安全维护、飞行状态监测、消除事故隐患以及故障定位方面也发挥着越来越重要的作用,甚至可以说充当着飞行过程中不可或缺的角色。
不能被轻视的程序日志
在软件开发中,程序日志就是我们软件开发的“黑匣子”,通过日志文件还原整个程序执行的过程,达到能透明地看到程序里执行情况,每个线程每个过程到底执行到哪,应当能够复原异常的整个现场乃至细节,从而帮我们定位问题出现的地方和原因,从而能够快速找到止损方案和优化改进方案。
但是我们大部分程序员平时在写程序代码过程中,一般会把主要精力集中在功能实现上,往往会忽视日志的重要性。作为程序员,写注释、写文档会被要求,因为站在软件维护的角度,他们是非常重要的。然而在我看来,写日志的重要性完全不亚于前两者,甚至在很多时候,比前两者更为重要。
世界上没有 100%完美的事,不存在没有 bug 的软件系统,一旦软件上线,如果系统发生了异常,我们却又对系统运行的状态一无所知,那我们就完全没有办法解决问题。有时候重启一下应用,重启一下系统什么的,也能临时解决,但这只是掩耳盗铃,该来的还会再来,出现过的异常,还会在某一天再次出现。虽然有些问题我们可以通过复现的方式去排查,但也仅局限于功能性的问题,对于安全性问题,系统异常问题等,这些都需要通过程序日志进行发现和排查。
程序日志如何写?
首先还是明确日志的目的是为了详细的记录软件运行的过程、状态等信息以便更好的定位问题,及时解决问题,所以日志包含的信息是什么非常重要,下图是网友整理的主要内容,具有很好的参考意义。
稍微强调几点注意事项:
1、应该根据日志的重要性或严重程度划分等级。最常用的日志级别有:DEBUG
、INFO
、WARN
、ERROR
,只有合理定义日志级别,才能避免日志混乱,而且通过级别设置可以减少没必要的打印,增加 IO 的压力。
2、系统功能的日志需要包含业务标识,用来定位具体是什么业务?哪笔业务?但要注意敏感内容输出,造成的安全隐患,比如用户密码、账户信息等。
3、通过日志框架而不是直接使用程序输出流(System.out
、System.err
)来打印日志内容,正式环境要采用文件日志而不是控制台日志。
4、日志内容应该异步输出,而不是同步阻塞的方式,特别是大并发场景下。
5、堆栈异常信息有助于程序异常的排查定位,但这部分信息的记录输出,对系统性能有一定的影响,应该酌情考虑。
6、在日志上添加一些链路追踪的扩展元素(OpenTracing 标识),将会很大程度方便通过日志进行程序请求调用的链路追踪,这在分布式系统中尤其重要。
7、记录程序日志的时机也很重要。远程调用、系统初始化、核心业务操作、预期外的错误、程序异常、特殊条件分支、需要跟踪的中间状态、请求的入口和出口等。
总体来说,日志就如同飞机的黑匣子一样重要,我们应当重视日志输出的编写工作,而绝非仅仅是完成核心业务代码的编写。
版权声明: 本文为 InfoQ 作者【菜根老谭】的原创文章。
原文链接:【http://xie.infoq.cn/article/7393d2fce9d0ad0ba4fdb6a47】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论