伴随着项目的成长,代码的规模越来越大、组件的关系越来越繁杂、部署的点位也越来越多,人肉运维逐渐难以维护项目的运行,日志的重要性的越发体现出来。
这次的改造涉及到项目中的多个 Go 程序,需要实现下列功能:
- 将程序运行时的信息写入日志文件
- 将程序崩溃时的错误写入日志文件
- 日志文件可以滚动更新
为了实现上述功能,使用了一些标准库和开源库,分别是:
代码实现
有了上述这些库的帮助,实际上我要做的事情已经很少了,大概还有这些:
- 配置开源库,文件大小、保存位置、保存数量等等
- 实现日志分级,在需要的时候开启 DEBUG,平时就输出 INFO 和 ERROR
- gin 框架 recovery 时写入日志,主程序 panic 时写入日志
最终的实现是这样:
在使用日志服务前,需要进行全局初始化:
WebRecovery
是写给 gin
框架的回调,用来记录 HTTP
服务执行过程中发生的 panic,使用时需要配置到 gin
框架中,用法如下:
如果程序本身崩溃了,那么也需要记录到日志中,可以通过 main 函数的 defer 实现这一点:
DEBUG 等级的日志正常不会被记录或显示,可以在程序运行时通过 flag 开启,如下:
最后,我们可以在程序各处埋点,添加不同级别的日志,例如: