软件运行日志
--------------------------------------------------------------------------------
现代软件日益复杂,彻底消除软件中的错误已经被证明是不可能的,那么,及时发现错误、定位错误现场信息,迅速排除软件错误就成为非常重要的事情,甚至在软件实际运行环境中也是如此。软件运行日志就是捕获错误现场信息的一种重要手段。
软件运行日志是给谁看的?我认为是软件维护人员、资深客户(比如客户方的系统管理员)。软件中的错误信息,应该分为两类,一类是软件用户能够理解的,另一类是软件用户不能理解的,需要软件维护人员介入的。前者,通常与软件用户的操作行为相关,软件用户在得到提示后,可以自行进行处理;而后者,通常与软件自身缺陷、软件部署环境问题相关的,只有软件维护人员才能处理的。很明显,对于后者的详细内容,没必要用告警对话框的方式提供给软件用户,而且这样做,会大大增加软件错误处理的复杂度。直接将其写入运行日志,是最简便、也最可靠的方法。可以想象下面的场景,应用软件在某台电脑上运行出错,软件维护人员或客户方系统管理员查看运行日志,发现了一些系统模块调用失败的信息,并与开发人员远程沟通,开发人员根据这些信息,迅速定位报告错误的代码,随后开发人员可能反馈,某个系统组件没有的到正确的配置,也可能反馈,软件中有一处缺陷,将在下一个版本或补丁包中得到修正。不管是哪一种情况,这一过程让我们感到的是效率和愉悦。
在了解到软件日志是给谁看的之后,我们就可以合理制定软件中的错误处理策略。一些错误,我们需要逐层向上报,最终得到妥善处理或者向用户给出提示;另一些错误,我们直接将其信息写入软件运行日志,并向上反馈本函数发生了错误,未能成功执行。
软件运行日志的内容有哪些?我认为可以分为:关键信息提示、警告提示、错误提示、致命问题提示、调试日志。关键信息提示,是指软件执行到了某些重要的节点,就将相应的信息写入软件运行日志,通过这些关键信息提示,我们可以了解软件的大致运行过程是否正常,而它成本非常低廉,相比安装庞大的开发调试环境。警告提示和错误提示,都是用于提示软件中的错误,那么两者之间的区别如何界定呢?还有,调试日志也是报告软件错误的,与这两者又如何相区别呢?
我认为,调试日志与警告提示、错误提示的本质性区别在于,调试日志是面向开发人员的,是从软件执行的角度发出的;警告提示、错误提示是从软件功能的角度发出的。换而言之,调试日志是记录软件运行中的非正常现象,而警告提示、错误提示是记录软件某项功能失常的相关信息。
我认为,警告提示、错误提示的本质性区别在于,警告提示是软件功能出现问题,但没有彻底失效;错误提示,就是此项功能完全失效,该项功能停止执行,立即返回;致命问题提示,则是软件整体安全受到威胁。反映到程序中,通常就是,在一个函数中检测到错误后,该函数以失败的方式返回,就报告错误提示;若函数仍能继续执行,就报告告警提示;若该错误严重违例,比如断言违例、内存溢出、堆栈溢出等威胁稳定性的错误,就报告致命问题提示。
一般来说,致命性提示,通常是与软件自身缺陷引起的,应当引起开发人员的重视;警告提示、错误提示多半是软件运行环境配置问题引起的,但也不排除软件缺陷、用户操作等因素,应当引起软件维护人员、系统管理员的注意。
对于软件维护人员,调试日志意义不大,而其数据输出量却往往相当大,因此,在软件部署运行环境下,通常应当通过配置开关,关闭调试日志输出。只有开发人员介入后,才有必要打开该开关,从而在缺乏调试工具的环境中,获得丰富的调试信息。
总的来说,将每一种错误、每一种软件环境配置问题都以对话框的方式提示出来,或许可以减小维护成本,代价却是开发成本成几何级数增长;软件开发中省掉错误处理,的确可减少一些成本,代价是即便一个环境配置问题,都需要开发人员现场调试,软件维护成本大大增加。而软件运行日志,无疑是两者之间取得平衡的关键性武器。