软件开发当中一般都要输出日志,生成日志文件。为了减少日志,很多日志库支持日志分级。这里为了简化讨论,我们假设两级,INFO和ERROR。平时开发的时候,两个级别的日志都输出,但是到了正式部署环境下,只输出ERROR级别的日志。这个设计看起来很美好,其实很糟糕,没有用处。
平时开发的时候,开发人员已经习惯了丰富的日志,在这种工作环境下养成了一系列根据日志定位问题的套路。到了正式部署环境,日志一下子变少了,立马会变得不适应,定位问题的效率会大幅下降,甚至会出现无法定位的情况。
养兵千日用在一时,输出日志最终的价值就是体现在定位现场问题。开发中,其实日志不算太重要,毕竟可以接入断点,单步跟踪。即便是依赖日志,也可以重编程序,为定位单个特定问题追加新的日志。但是定位现场问题,日志是我们唯一的定位依据,不可能重新操作反复重现,也不可能为了临时追加日志重启系统。特别是定位多线程引发的故障时,恨不得每个线程每执行一行代码都输出一行日志,然后脑补这些线程谁先执行,谁后执行,谁比谁快,谁比谁慢。
那么我们到底该如何做才是正途呢?
- 不要区分级别,平时开发和工程现场都是同样的日志,给开发人员一个舒服的定位问题的环境。
- 引入合适的日志收集和压缩机制,日志都是文本文件,压缩一下可以极大程度减少文件大小。另外硬盘不值钱,多占用一点也无妨。
- 设计良好的日志文件名,压缩包的包名,方便日志文件的查找。
- 打印日志的代码好好设计,方便用程序从多个文件中提取定位某类问题关心的日志信息。
- 下苦功夫,找到并且删除冗余日志,从源头真实的减少日志。