和在学校做大作业、毕业设计不同,代码一旦到了生产环境,查找问题、服务监控等操作都需要通过日志来完成了。以前的项目,更多的是从其他同事手中交接一些服务,服务中已经积攒了一些(无论好坏)打日志的规范和方法。
近期(其实已经一年了,一直懒得总结)由于排期问题,我糙猛快的写了几个python的服务;而我之前的同事里,是没有人使用py来做项目的,所以总结了一下python中使用日志的使用方式、配置文件的编写,以及一些`helper`方法。
日志的存储
储存日志的方式是多种多样: 使用网络的、使用文件的、还有使用mongo的。由于公司惯例,全部日志都会打到文件里,然后使用 「年月日时」的方式做为文件名 -- 这是一个好习惯,能够很好的控制日志文件体积,也能在查找问题时快速定位日志; 同时让日志的备份与删除变得容易,只要使用对应的「date」操作就可以完成;还可以根据日志量粗略判断服务压力变化(我知道你们有监控,谁没有呢)。
增加日志
在python中,最简单地使用日志的方式是这样了:
#! /usr/bin/env python
import logging as lg
if __name__ == '__main__':
lg.warning('this is a warning')
这时,打印出来的日志,就会打印到终端(还没有写到文件里)。如果想写到文件,你需要增加一些配置:
#! /usr/bin/env python
import logging as lg
if __name__ == '__main__':
lg.basicConfig(filename='pylog.log')
lg.warning('this is a warning')
重新执行这个文件,终端的输出不见了,文件里面会记录你增加的日志。这样,你就可以使用grep、sed和awk来处理日志,查找响应的信息了。
`basicConfig`还有一些参数可以设置: filename, filemode, format, datefmt, level, stream。 配合不同的日志等级,这种使用方式可以满足绝大多数脚本的需求。
LogLevel
如果你用过gcc,那你一定忽略warning而不能无视error。在程序中也是一样: 有一些错误是需要你注意的,比如缓存容量已经使用了70%,需要你手动干预;一些错误需要你起床来处理的,比如db无法连接。人工去过滤这些信息是不可能的,所以需要合理的使用log level,来完成对应的操作。
python自带的logging提供了debug、info、warning、error和critical五种不同的日志级别,用来区分不同的场景。五种级别,严重成都递增,且设置loglevel后(翻到上面,看看baseConfig的介绍),会屏蔽低优先级的日志(也就是说,如果你设置log level为warning,那么info日志就不会出现在日志文件中)。详细介绍在 https://docs.python.org/2/howto/logging.html 。在我日常的使用中,是这样设置loglevel的:
- 开发环境,debug
- 线下联调,info
- 线上环境,warning
配合合理的优先级,当你需要查找某类日志时,只需要这么做:
WARNING:root:this is a warning
到目前为止,简单介绍了日志的使用和分级,后续会介绍生产环境中的一些常用配置,和一些helper方法。