Python Logging
原来真的远比我想象的要复杂很多很多,学习路线堪比git。但是又绕不过去,alternatives又少,所以必须要予以重视,踏踏实实认认真真的来好好学学才行。
学习Logging的目的:
简单脚本还好,print足够。
但是稍微复杂点,哪怕是三四个文件加起来两三百行代码,调试也开始变复杂起来了。
再加上如果是后台长期运行的那种脚本,运行信息的调查更是复杂起来。
一开始我还在各种查crontab
的日志查看,或者是python
后台运行查看,或者是python stdout
的获取等等,全都找错了方向。
真正的解决方案在于正确的logging。
记录好了的话,我不需要去找python的控制台输出stdout,也不需要找crontab的日志,只需要查看log文件即可。
下面是python的logging学习记录。
最简单的日志输出(无文件记录)
import logging logging.error("出现了错误")logging.info("打印信息")logging.warning("警告信息")
首先,忘掉logging.info()! 忘掉logging.basicConfig()!
网上各种关于python logging的文章实在是太不体谅新手了,logging这么复杂的东西竟然想表现得很简单,还用各种简单的东西做假象。
实际上我们真正要用起来的日志,绝对是不会直接用logging.info()
和logging.basicConfig()
这样的,这是此模块的官方推出来迷惑人的——看似让你一键上手,快速看到结果,但是跟实际真的不搭!
所以为了后面解释起来轻松,必须先警告这点:忘记它们俩!
记住,唯一要用到logging.
什么的,就只有logging.getLogger()
这一次。
了解logging的工作流
不想上流程图一类的东西,那样反而更迷糊。
简单说吧:
logging
模块是会自动将你自定制的logger对象全局化
的,
也就是说,你在自己的模块里只要定义了一次某个logger,比如叫log,那么只要是在同一个模块中运行的其他文件都能读取到它。
比如说,你在主文件main.py中自定义了一个logger,可能设置了什么输出文件、输出格式什么的,然后你在main.py
中会引用一些别的文件或模块,比如sub.py
,那么在这个sub.py中你什么都不用设置,只要用一句logger = logging.getLogger('之前在main.py定义的日志名')
即可获得之前的一切自定义设置。
当然,被调用的文件(先称为子模块)中,用logging.getLogger('日志名')
时,最好在日志名后加一个.子名称
这样的,比如main.sub。这样输出的时候就会显示出来某条日志记录是来自于这个文件里了。当然,.前面的父级logger必须名字一致,是会被识别出来的!
新闻热点
疑难解答