logging模块
日志相关概念
内容
日志可以追踪软件运行时所发生的事件,开发者可以在代码中调用记录日志的模块来表明程序运行到这里发生了什么。
一条日志信息可以包括:
打印时间
日志级别
发生位置
日志内容
等级
在测试环境需要debug等级日志,正式上线后需要info等级日志,如果有需要,线上业务的日志等级也可以调回到debug。
debug等级记录大量运行信息,意味着消耗大量磁盘空间、cpu等机器性能。
开发者可以通过修改配置文件的方式调整级别,重启或者重载配置的方式生效。
实现
几乎所有开发语言都会内置日志性格功能,python的日志模块就是logging,也有一些优秀的第三方库,比如log4j(java)
logging模块
basicConfig:
logging.basicConfig函数各参数: filename:指定日志文件名; filemode:和file函数意义相同,指定日志文件的打开模式,'w'或者'a'; format:指定输出的格式和内容,format可以输出很多有用的信息, 参数: %(levelno)s:打印日志级别的数值 %(levelname)s:打印日志级别的名称 %(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0] %(filename)s:打印当前执行程序名 %(funcName)s:打印日志的当前函数 %(name)s:打印函数名 %(lineno)d:打印日志的当前行号 %(asctime)s:打印日志的时间 %(thread)d:打印线程ID %(threadName)s:打印线程名称 %(process)d:打印进程ID %(message)s:打印日志信息 datefmt:指定时间格式,同time.strftime(); level:设置日志级别,默认为logging.WARNNING;
记录器Logger:
Logger是记录日志的入口
日志器(Logger)是有层级关系的, 上面调用的logging模块级别的函数所使用的日志器是RootLogger类的实例, 其名称为'root',它是处于日志器层级关系最顶层的日志器, 且该实例是以单例模式存在的。
import logging logging.basicConfig(filename='TestApp.log',level=logging.DEBUG,format='%(asctime)s :: %(filename)s-%(lineno)d :: %(message)s') logging.info("Start print log") logging.debug("Do something") logging.warning("Something maybe fail.") logging.info("Finish") >> 2018-11-23 14:42:43,001 :: tmp.py-4 :: Start print log 2018-11-23 14:42:43,002 :: tmp.py-5 :: Do something 2018-11-23 14:42:43,002 :: tmp.py-6 :: Something maybe fail. 2018-11-23 14:42:43,002 :: tmp.py-7 :: Finish #logging默认使用的日志其Logger是RootLogger类的实例,其名称为'root',它是处于日志器层级关系最顶层的日志器
import logging logging.basicConfig(filename='TestApp.log',level=logging.DEBUG,format='%(asctime)s :: %(name)s :: %(message)s') logger = logging.getLogger(__name__) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") logger.info("Finish") >> 2018-11-23 15:39:52,235 :: __main__ :: Start print log 2018-11-23 15:39:52,235 :: __main__ :: Do something 2018-11-23 15:39:52,235 :: __main__ :: Something maybe fail. 2018-11-23 15:39:52,235 :: __main__ :: Finish #创建一个日志器实例 #logging.getLogger([name=None]) # 指定name,返回一个名称为name的Logger实例。 #如果再次使用相同的名字,是实例化一个对象。 #未指定name,返回Logger实例,名称是root,即根Logger。