Winter Han
2017-12-20 at ShangHai
与C#,java等强类型语言有强大的支持断点调试IDE不同,大多数写python的场景,是写一些小工具,犯不着用pycharm这样专业的IDE。更多的时候,直接使用Notepad++,Sublime Text进行开发。
如何去“调试”代码?这个问题必须要解决!
用“print语句”,可能是大多数人的共同选择了。
像这样
image.png
怎样避免写出上面的代码呢?
先介绍一下logging
要完成记日志这个事儿呢,必须要有logger, handler这两个对象。
logger对象规定了整个的处理流程,但具体如何处理,却依赖于注入的具体的handler处理。
quickstart
import logging
# create logger
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)
# create file handler and set level to debug
handler = logging.FileHandler('log.txt', 'a')
handler.setLevel(logging.DEBUG)
# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# add formatter to handler
handler.setFormatter(formatter)
# add handler to logger
logger.addHandler(handler)
# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
用logging 替代 print 调试
print,只推荐,在命令行程序的输出中用用。但就我们团队现状来看,被滥用于各种模块中,可能是普遍现象。
在开发阶段,调试时直接print出来,非常顺爽。但系统上线后,要注销这些print也是要工作量的,往往是不会做这项工作的。这就造成了一些不可预料的问题,甚至可能导致IO报错,使整个应用崩溃。
思路:多给logger注册一个用于向console输出的handler
StreamHandler对象就是,向标准输出设备,输出信息的 handler。
比如 上例,我们除注册FileHandler对象外,可以再注册一个StreamHandler对象。
上线后,再将其注释掉,就可以了。
........
# create console handler and set level to debug
stream_hander = logging.StreamHandler()
stream_hander.setLevel(logging.DEBUG)
........
# add file_hander and stream_hander to logger
logger.addHandler(handler)
logger.addHandler(stream_hander)
........
在Flask框架中使用logging踩过的坑
在Flask框架中使用logging的过程中,踩过一个坑。可能别的框架也会出现。
logging配置都是对的,且日志文件也生成了,就是不往里面写日志
可能是两个原因造成的。
一、使用了debug模式
二、使用了app.errorhandler装饰器