服务一般情况下运行在后台,没有界面,很难观察到服务的状态。因此,对于服务运维,日志变成了一个非常重要的工具。通过服务日志,可以了解到服务的运行状态,如服务是否正常运行,服务处理了哪些请求,哪些请求被正确的处理,哪些请求处理出现了错误等等。当然,通过linux命令,如top,ps,netstat获取到服务的状态,如服务进程是否存在,服务端口是否打开,通过linux命令获取到的这些信息都是很表面的,只能做到“知其然,不知其所以然”,很明显,这不是我们的目的。
服务日志不应该仅仅包含服务的启动,停止信息,这些知识只是最基本的。服务日志应该包含以下信息:
基本信息
基本信息指每条日志都应该包含的内容。首先,时间必不可少,这没有什么好说的;其次,级别也是必不可少的,一般情况下,级别分为调试,运行,警告,错误,致命错误五个等级,这些信息可以用来快速过滤日志;再次,模块信息也应该包含在内,即这条日志来自哪个源文件,或者哪个函数哪个类,首先这些信息有助于快速过滤日志,其次这新信息有助于快速定位问题。
启动信息
启动信息首先应该包含版本信息,这将有助于判断当前运行服务版本是否是目标版本;其次,模块加载信息也是十分必要的,模块加载信息应该包含模块版本,路径,参数等,这对于排查请求处理失败的原因是很重要的;
退出信息
退出信息有注意排查服务是正常退出,还是异常退出,或者是被kill掉。
请求处理信息
请求处理信息首先应该包含请求处理参数,这对于处理失败原因的排查非常重要;其次应该记录请求的处理时间,如果做得更精细,可以记录每一步的处理时间,这对于服务性能优化很重要;最重要的一点,一定要记录请求处理的失败原因,以便排查错误。请求无论处理失败,都应该有一条日志,方便qps,错误率的计算。请求日志还应该注意不要重复,否则,统计结果是准确的。
服务日志应该注意以下几个问题:
格式化
格式化的日志方便后期处理,及问题排查;
敏感信息
用户信息,数据库用户名,密码等信息已经要经过处理,再写入日志;
周期清理
互联网服务的请求量非常大,qps经常上万,日志经常1个小时就达到几个G,因此一定要周期性地清理日志,否则磁盘会被写爆,造成服务瘫痪,这也是很容易被忽略的一点。对于服务运维,相比磁盘空间,大家更关注QPS,CPU,内存,性能等问题。
监控
为了更好地把日志利用起来,可以周期性地对日志进行统计计算,如QPS,错误率,响应时间等信息,更好地监控服务器的运行状态。