Python Logging 日志记录入门学习
作者:SolomonXie 发布时间:2022-05-17 14:48:39
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必须名字一致,是会被识别出来的!
然后,子日志还可以再子日志,甚至一个子模块可以再让所有函数各又一个子子日志,比如main.sub.func1这样的。logging都会根据.识别出来上下级关系的。
这样一说,实际上也就是class类继承的那种机制了。你按照父级名称继承,然后还可以改写自己的新设置等。
了解了这些概念以后,才能来谈代码。实际上也就好理解多了。
设置logger的方法
看来看去,这篇文章说得比较全面也最清楚,以下很多都参考到它的内容:Python 101: An Intro to logging
一般想要自定义一个logger,比如让它输出信息时按照什么格式显示,输出到哪个文件,要不要输出到屏幕一类,有三种方法可以达到设置:
直接在python代码里设置
用外部的config.ini文件配置
用python的dict字典配置
三种达到的目的都是一样的,字典用的人很少也不方便,配置文件比较好用只是.ini的语法不是很方便读,且不容易做到变量的动态设置,所以一般直接在python代码里写就好。
常用设置语句
以下是程序主入口文件的通用写法,注意,一定要在主入口定义好logger,这样其他所有的子模块才能够继承到。
# main.py
import logging
import otherMod2 # 等下会调用到的子模块
def main():
"""
这个文件是程序的主入口
"""
define_logger()
log = logging.getLogger('exampleApp')
# 输出信息测试
logger.info("Program started")
result = otherMod2.add(7, 8) # 这个是来自别的模块的方法
logger.info("Done!")
def define_logger():
logger = logging.getLogger("exampleApp")
logger.setLevel(logging.INFO)
# 设置输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 设置日志文件处理器
fh = logging.FileHandler("new_snake.log")
fh.setFormatter(formatter) # 为这个处理器添加格式
# 设置屏幕stdout输出处理器
sh = logging.StreamHandler(stream=None)
sh.setFormatter(formatter)
# 把处理器加到logger上
logger.addHandler(fh)
logger.addHandler(sh)
if __name__ == "__main__":
main()
下面是子模块中的调用方法(很简单):
# otherMod2.py
import logging
module_logger = logging.getLogger("exampleApp.otherMod2")
def add(x, y):
# 这里一句`getLogger`就继承到父级的logger了
logger = logging.getLogger("exampleApp.otherMod2.add")
# 输出测试
logger.info("added %s and %s to get %s" % (x, y, x+y))
return x+y
注意,主文件中,在什么地方定义logger都可以,可以在main()里也可以在任何单独的函数或类里,无所谓。只要在调用子模块之前定义好了就可以了。一旦定义过,日志名就会被记下来,然后子模块就可以轻松继承到。
来源:https://segmentfault.com/a/1190000015143449


猜你喜欢
- PyQt5 事件处理机制PyQt为事件处理提供了两种机制:高级的信号与槽机制,以及低级的事件处理机制。信号与槽可以说是对事件处理机制的高级封
- UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,如果是
- open函数你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的辅助方法才可以调用它进行读写。语法:fil
- 目录一、两个模块二、SMTP端口三、四大步骤1、构造邮件内容2、连接邮件服务器3、登陆邮件服务器4、发送邮件四、常用场景1、纯文本邮件2、发
- 这两天在搞Theano,要把mat文件转成pickle格式载入Python。Matlab是把一维数组当做n*1的矩阵的,但Numpy里还是有
- WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。官方对
- 后来参巧网上的文献后,通过Http方式成功连上服务器的MYSql数据库。特此记录一下:首先到NaviCat官网(www.NaviCat.co
- [Q]怎么样查询特殊字符,如通配符%与_ [Q]如何插入单引号到数据库表中 [Q]怎样设置事务一致性 [Q]怎么样利
- 环境: 192.168.100.210  
- 题目描述:(1)模拟登陆界面,判别用户名和密码,给出合适的提示,如果超过三次,锁定输入。用代替密码;或者最新输入显示,前面的变成;安全性措施
- 木马原理:入侵者使用诸如ASP图片木马生成器之类的工具将一张正常的图片与一个ASP木马文件合并成一个图片文件(即将对网站有害的ASP代码插在
- 我就废话不多说啦,还是直接看代码吧!try: print(a)except Exception as e: prin
- 本文实例讲述了Python实现将目录中TXT合并成一个大TXT文件的方法。分享给大家供大家参考。具体如下:在网上下了一个dota的英雄攻略,
- 一、前提 这里的原则只是针对MySQL数据库,其他的数据库某些是殊途同归,某些还是存在差异。我总结的也是MySQL普遍的规则,对于某些特殊情
- 这次介绍日期数据处理。用python中的方法对日期数据进行处理, 我们可以获取很多有用的信息, 比如年月日,星期,周次,季度等, 这里分享工
- 1:masterha_check_repl 副本集方面报错 replicates is not defined in
- 系统中对Razor的支持包括两部分,其中之一就是自定义RazorViewEngine一、自定义RazorViewEngine在Global.
- 这里简单介绍下两种安装docker-compose的方式,第一种方式相对简单,但是由于网络问题,常常安装不上,并且经常会断开,第二种方式略微
- QSpinBox 是一个计数器控件,允许用户选择一个整数值,通过单击向上/向下按钮或按键盘上的上/下箭头来增加/减少当前显示的值,当然用户也
- 上一讲完成了基本博客的配置和项目工程的生成。这次开始将博客一些基本的操作主要是数据库方面学习。1.设计博客数据库表结构博客最主要的功能就是展