最近在用perl开发系统的监控程序,在对日志的观测过程中突然想弄清楚什么时候该用什么级别的日志。
从日志角度出发,目前有info,notice,warning,error和alert几个级别,abort代表最严重级别,error其次,正常信息一般使用info或notice级别。
参考http://blog.csdn.net/beckdon/article/details/32696047
系统中的错误使用warning,error,alert三个级别。
warning属于轻微错误,对系统基本没有影响,如跳过了某项重复检查,生成重复文件(视情况而定)等。此处提到的出错处理不包含warning部分,因为影响比较小。
error和alert,具体代表的含义可以因系统而异,但是普遍的error代表一些重大的错误讯息,需要及时找到原因;alert代表更严重的警告。
在目前已开发的系统中,发生error错误会给出报告,而alert等级会直接退出perl脚本(使用confess或die)。但是现在回过头看,如果在脚本运行过程中,发生创建文件或建立数据库连接错误直接退出系统(系统是由各个perl脚本组成,通过crontab定时运行),会有些不太合适的地方。
我个人的思考是:
1. 系统是长时间不间断运行的情况下,如果在初始化阶段发生error或以上级别的错误,直接退出初始化,返回失败进行人工检查;如果在初始化通过后,运行过程中发生错误,系统都不应该自我退出(自己调用exit等)。但是,不退出也就意味着错误必须及时报告并处理,也就要求系统必须有一个出错情况的报告通道。因为系统运行中几乎肯定会有错误情况,有些是用户行为导致,有些是系统代码bug,也有些是硬件或网络导致,所以异常通知是和测试、监控同等重要的模块。
对系统来说,某一代码行报错后,后面的代码可能就不需要执行了,这时候需要报告错误,然后或者抛出异常,或者返回错误码,层层返回,直至可以容忍错误的代码行。最终,可能会形成一个异常链,并有异常转义操作。类似的过程可以学习spring mvc集中处理异常。
http://www.ibm.com/developerworks/cn/java/j-lo-exceptionframework/
http://www.cnblogs.com/zanxiaofeng/archive/2012/02/17/Exception.html
目前使用的报告方式为邮件通知和网页展示错误消息:邮件通知的优点是会有个提示告诉管理员有邮件到达,可以及时查看,缺点是短时间内可能收到多封邮件;网页能更丰富的展示信息,方便全面了解问题。
2. 系统是定时运行的,这类系统大多是无状态的,也就是这次运行不会对下次运行有大的影响。首先在初始化阶段发生error,依然建议直接退出运行并报告错误。
如果是运行中出现error或alert等级错误,因为是定时运行,所以后续代码无需运行时,这里也可以直接退出程序。后续代码仍然有许多工作要处理,则建议报出error,继续运行。
由上面两点继续引申出参数传递方式:最基础的参数如“文件目录,控制标志”等需要从系统配置文件读取的数值应该只在最外层函数或者init()函数内读取出来,还有比如数据库链接等也是在外层函数创建好,内部函数或模块需要的话由外层函数传入,而不是自己去读取配置文件。这么做的好处是:1. 出错控制,这些数值会对系统正常运行产生很大影响,在最外层处理可以最早的发现错误。 2. 方便测试,可以在不同的环境中测试内部函数和模块,只需要传入不同的参数值即可。
相比于非受控异常,受控异常的作用:1.有的时候无法提前检查,如不知道文件是否可读等;2. 非技术性(如数组越界等)错误,处理后可正常运行;3. 对错误信息加工,使其更友好。
另外log的格式是一个很重要的因素,尤其是多语言共同开发的情况下,参考unix下syslog日志格式,应含有如下信息:日期,时间,主机名,报错程序或模块,进程号,线程号(如果有),用户名,函数名,行号,错误等级,出错信息。
日志记录什么?明确的一点是,内容要具体、清晰,不能有模糊的需要猜测的地方。
1. 运行过程的重要节点,包括开始时间,完成时间,进行的操作,状态的变化等。
2. 接收和发送的信息,包括谁,进行了哪些操作,传入的参数,传出给谁等。
3. 产生的数据,类型,字节数,来源,耗时等。
4. 异常信息,以及发生异常时,所处环境的信息。
另一个比较重要的是保持风格和记录逻辑的一致性,比如修改了代码或者增加了功能之后,日志信息应该前后一致,信息内容的风格也应该一样。
日志也可以存储在数据库中,好处是可以及时查询。关键信息包括:jobID(如果有)、修改时间、状态、错误信息、数据目录、状态节点信息(如什么时间到达了什么状态)等。
不需要太考虑存储空间的问题,硬盘空间相对来说是很廉价的,但是多一些日志内容却能提供很多的信息。只要估算好数据表的增长趋势,保证一定的查询速度。