问 题
我有个脚本需要不停地跑,已经使用logging的TimedRotatingFileHandler安装时间进行了切割,并且只保存最近两天的数据。以下是我logging定义的内容
log_fmt = '%(threadName)s %(asctime)s %(levelname)s %(message)s'
formatter = logging.Formatter(log_fmt)
log_file_handler = TimedRotatingFileHandler(filename='logs/'+myselfName, when="midnight", interval=1, backupCount=2)
log_file_handler.setFormatter(formatter)
logging.basicConfig(level=logging.INFO,format=log_fmt)
logger = logging.getLogger()
logger.addHandler(log_file_handler)
脚本跑了几天了,我发现个问题,如果代码报错(出bug了)是不会被记录到logging中的,这样的话,就导致我看不到什么原因报错了,只能看到代码执行到某个流程卡住了,有什么办法,可以看到报错的语句吗?
补充一下,我的程序背景可能比较好,我这个脚本是gevent协程库的一个脚本,也就是说其中一个协程可能报错了,但是不会影响整个程序中断,别的协程在接着跑,最后导致在客户端看到的数据就是某些字段缺失了或者字段没有被计算过
可能有人提醒我用try except 捕捉一下,这是知道报错的位置的前提用的方法,关键我不知道哪里有报错,想知道如果不用try except,有什么办法?
解决方案
如果不知道程序错在哪,还不能输出,又没办法DEBUG的话,确实处理起来比较麻烦。不过你可以使用原始一点的方法,在程序每个模块,或者某些关键的方法运行即将结束的结尾,加上一个with open('test.txt','a') as f: f.write('mark1:%s'%time.strftime('%Y-%m-%d %H:%M:%S')),按照程序运行的顺序mark2,mark3...,当程序运行结果不对的时候,你查看日志文件log.txt,看看是不是按照顺序mark1、2、3、4,哪个地方没有,那就是出错了,然后再针对性地try except就OK了。大体思路就是,既然logging库用不了,为什么不自己搞一个能用的日志系统呢?个人思路,仅供参考,不喜勿踩。
扫一扫关注IT屋
微信公众号搜索 “ IT屋 ” ,选择关注与百万开发者在一起