python中logging模块详解---让你的每一步操作都有迹可循
在公司开发的任何一个系统都会有日志设计,通过日志,把系统的行为记录并保存起来,一旦系统发生了一些问题便可以通过日志去分析问题发生在哪里,是因为什么原因发生的。同样,我们在设计测试框架的时候,也可以通过设计日志来记录框架的整个测试流程,一旦执行过程中出现异常,我们也能通过日志中记录的错误信息找到问题发生的症结。日志技术非常多,我们选择的是python的logging模块,有关logging我们需要先了解一下它的基本信息:
- 日志分为5个级别,分别是:DEBUG , INFO , WARNING , ERROR , CRITICAL,日志严重级别从左往右逐渐增加,一般在python写日志系统时,我们对于普通的信息输出会定位INFO级别,对于异常信息,定位为ERROR级别;
- 日志输出渠道有两个handler : console(控制台) 和 file(指定文件);
- 日志输出可以指定格式:formatter;
- 日志输出完毕后,要移除handler,否则会导致日志输出重复。
1、日志级别
在上面我们已经为大家介绍了日志的五个级别,下面我们将为大家详细介绍这五个级别,并通过代码的形式为大家进行演示:
**DEBUG:输出详细的运行情况,主要用于调试;
**INFO:确认一切按预期运行,一般用于输出重要运行情况;
**WARNING:一些意想不到的事情发生了(比如:“警告:内存空间不足”),但是这个软件还能按预期工作,在不久的将来会出现问题;
**ERROR:发生了错误,软件没能执行一些功能,还可以继续执行;
**CRITICAL:一个严重的错误,表明程序本身可能无法将继续运行。
这5个等级,也分别对应5种打印日志的方法:debug、info、warning、error、critical。默认的root logger的打印级别是warning,低于该级别的日志不会被跟踪,也就是只有warning、error、critical级别的日志才会被跟踪。
示范代码如下:
2、logger对象
1)logger对象方法
- Logger.setLevel(level):设置Logger对象日志消息级别
- Logger.addHandler(hdlr):为Logger对象添加handler对象
- Logger.removeHandler(hdlr):为Logger对象移除handler对象
- Logger.hasHandlers():判断是否有处理器
- Logger.addFilter(filter):为Logger对象添加filter对象
- Logger.removeFilter(filter):为Logger对象移除filter对象
2)Logger对象创建日志记录
- Logger.debug(msg, *args, **kwargs):创建一个与方法名等级相同为debug的日志记录
- Logger.info(msg, *args, **kwargs):创建一个与方法名等级相同为info的日志记录
- Logger.warning(msg, *args, **kwargs):创建一个与方法名等级相同为warning的日志记录
- Logger.error(msg, *args, **kwargs):创建一个与方法名等级相同为error的日志记录
- Logger.critical(msg, *args, **kwargs):创建一个与方法名等级相同为critical的日志记录
3)获取Logger对象的方法
logging.getLogger(name):创建一个Logger对象。
其中,name为可选项,如果在创建Logger对象时不传入名称则默认为root收集器,我们知道root收集器默认是只收集warning级别及以上的日志的。
示范代码如下:
3、Hnadler处理器
1)Handler对象方法:
- Handler.setLevel(level):设置处理器将会处理的日志消息的最低级别
- Handler.setFormatter(fmt):为处理器设置格式器对象
- Handler.addFilter(filter):为处理器添加过滤器对象
- Handler.removeFilter(filter):为处理器删除过滤器对象
2)获得Handler对象
示范代码如下:
需要注意的是,stream_handler 和 file_handler的level是可以设置不同的级别的,这就方便我们在做调试和日常监控运行的时候写入文件设置不同的级别。一般我们在做调试的时候需要打印更详细的日志,即使用 DEBUG 级别,以便调试代码,而当代码真正跑起来以后,我们只需要对关键的环节进行监控即可,一般使用INFO级别就够了。
4、日志的格式化输出
可通过logging.Formatter函数来配置格式化日志输出内容,这个参数可以输出很多有用的信息,如下:
- %(name)s:收集器名称
- %(levelno)s:打印日志级别的数字
- %(levelname)s:打印日志级别名称
- %(pathname)s:打印当前执行程序的路径
- %(filename)s:打印当前执行程序名
- %(funcName)s:打印日志的当前函数
- %(lineno)d:打印日志的当前行号
- %(asctime)s:打印日志的时间
- %(thread)d:打印线程ID
- %(threadName)s:打印线程名称
- %(process)d:打印进程ID
- %(message)s:打印日志信息
下面我们为大家写一段代码,介绍最常用的日志输出格式,并调用这个格式进行日志的输出,示范代码如下:
运行代码后,可以看到控制台的输出内容如下所示:
这里为大家列出的是最常用的日志输出格式,大家也可以根据自己公司的需要去定制添加不同的内容。如果觉得这个格式比较难记住,那大家也不必担心,下一节我们会将日志模块进行封装,方便大家进行调用。