Python中的logging模块

317 阅读4分钟

写python程序时,可以用print函数来打印相关信息。但是如果需要快速查看特别是快速控制信息的显示与关闭时,print就不大方便了,所以Python引入了logging模块来记录我想要的信息。logging相对print来说更好控制输出在哪个地方,怎么输出及控制消息级别来过滤掉那些不需要的信息。

1.日志级别

	import logging  # 引入logging模块
	# 将信息打印到控制台上
	logging.debug(u"aaa")
	logging.info(u"bbb")
	logging.warning(u"ccc")
	logging.error(u"ddd")
	logging.critical(u"eee")
    >>> WARNING:root:ccc
	ERROR:root:ddd
	CRITICAL:root:eee

上面只有后面三个能打印出来,默认生成的root logger的level是logging.WARNING,低于该级别的就不输出了。 

级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG。debug : 打印全部的日志;  info : 打印info,warning,error,critical级别的日志,确认一切按预期运行; warning : 打印warning,error,critical级别的日志;error : 打印error,critical级别的日志,严重的问题,软件没能执行一些功能; critical : 打印critical级别,表明程序本身可能无法继续运行。 也可以引入NOTSET级别来显示全部信息,如在上面引入模块后加入下面的代码,则所有的信息都会输出。 logging.basicConfig(level=logging.NOTSET) 

2.日志格式 

	%(levelno)s: 打印日志级别的数值
	%(levelname)s: 打印日志级别名称
	%(pathname)s: 打印当前执行程序的路径(sys.argv[0])
	%(filename)s: 打印当前执行程序名
	%(funcName)s: 打印日志的当前函数
	%(lineno)d: 打印日志的当前行号
	%(asctime)s: 打印日志的时间
	%(thread)d: 打印线程ID
	%(threadName)s: 打印线程名称
	%(process)d: 打印进程ID
	%(message)s: 打印日志信息
	import logging  # 引入logging模块
	# logging.basicConfig函数对日志的输出格式及方式做相关配置
	logging.basicConfig(level=logging.DEBUG,format='%(asctime)s - %(filename)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')

	# 由于日志基本配置中级别设置为DEBUG,所以一下打印信息将会全部显示在控制台上
	logging.info('info message')
	logging.debug('debug message')
	logging.warning('warning message')
	logging.error('error message')
	logging.critical('critical message')
    >>> 2020-09-08 19:07:50,699 - test.py - C:/Users/So/source/repos/python/alien/test.py[line:64] - INFO: info message
	2020-09-08 19:07:50,699 - test.py - C:/Users/So/source/repos/python/alien/test.py[line:65] - DEBUG: debug message
	2020-09-08 19:07:50,699 - test.py - C:/Users/So/source/repos/python/alien/test.py[line:66] - WARNING: warning message
	2020-09-08 19:07:50,699 - test.py - C:/Users/So/source/repos/python/alien/test.py[line:67] - ERROR: error message
	2020-09-08 19:07:50,699 - test.py - C:/Users/So/source/repos/python/alien/test.py[line:68] - CRITICAL: critical message

3.logger 

Logging.Logger:Logger是Logging模块的主体,进行以下三项工作: 

1. 为程序提供记录日志的接口 2. 判断日志所处级别,并判断是否要过滤 3. 根据其日志级别将该条日志分发给不同handler 

常用函数有:

	Logger.setLevel() 设置日志级别
	Logger.addHandler() 和 Logger.removeHandler() 添加和删除一个Handler
	Logger.addFilter() 添加一个Filter,过滤作用
	Logging.Handler:Handler基于日志级别对日志进行分发,如设置为WARNING级别的Handler只会处理WARNING及以上级别的日志。

	import logging  # 引入logging模块
	import os.path
	import time
	# 第一步,创建一个logger
	logger = logging.getLogger()
	# Log等级总开关
	logger.setLevel(logging.DEBUG)
	# 第二步,创建一个handler,用于写入日志文件
	rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))  # strftime接收以时间元组,并返回以可读字符串表示的当地时间,格式由参数format决定
	# os.getcwd()返回当前工作目录,os.path.dirname(path),去掉文件名及斜杠,返回目录
	log_name = os.getcwd() + '\\' + rq + '.txt'
	logfile = log_name
	fh = logging.FileHandler(logfile, mode='w')
	# 输出到file的log等级的开关,这个开关和上面的总开关两者取等级高的起作用
	fh.setLevel(logging.ERROR)
	# 第三步,定义handler的输出格式
	formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
	fh.setFormatter(formatter)
	# 第四步,将logger添加到handler里面
	logger.addHandler(fh)
	# 日志
	logger.debug('debug message')
	logger.info('info message')
	logger.warning('warning message')
	logger.error('error message')
	logger.critical('critical message')
    >>> C:\Users\So\source\repos\python\alien\202009082030.txt

输出到文件也可以采用下面简单的方式,即还是采用basicConfig函数配置

	import logging  # 引入logging模块
	import time
	rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
	log_name = os.getcwd() + '\\' + rq + '.txt'
	logging.basicConfig(filename = log_name, level=logging.DEBUG,
						format='%(asctime)s - %(filename)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')  # logging.basicConfig函数对日志的输出格式及方式做相关配置
	# 由于日志基本配置中级别设置为DEBUG,所以一下打印信息将会全部显示在控制台上
	logging.info('info message')
	logging.debug('debug message')
	logging.warning('warning message')
	logging.error('error message')
	logging.critical('critical message')
    >>> C:\Users\So\source\repos\python\alien\202009082045.txt

4.关闭打印 

logging.disable(level)  关闭level及以下等级的打印信息

	import logging  # 引入logging模块
	logging.disable(logging.INFO)
	logging.basicConfig(level=logging.NOTSET)  # 设置日志级别
	# 将信息打印到控制台上
	logging.debug(u"aaa")
	logging.info(u"bbb")
	logging.warning(u"ccc")
	logging.error(u"ddd")
	logging.critical(u"eee")
    >>> WARNING:root:ccc
	ERROR:root:ddd
	CRITICAL:root:eee