2.4 使用logging记录日志

用Python写代码的时候,在想看的地方写个print() 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当需要看大量的地方或者在一个文件中查看的时候,这时候print()就不大方便了,所以Python引入了logging模块来记录想要的信息。print()也可以输入日志,logging相对print来说更好控制输出在哪个地方,怎么输出及控制消息级别来过滤掉那些不需要的信息。

先定输出日志的等级,调整日志输出的等级不同,就可以快速的关闭和打印日志。

引入的包

import logging

控制日志打印等级的语句

logging.basicConfig(level=logging.INFO)

日志的级别:

默认生成的root logger的level是logging.WARNING,低于该级别的就不输出了

级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG

  1. debug : 打印全部的日志,详细的信息,通常只出现在诊断问题上
  2. info : 打印info,warning,error,critical级别的日志,确认一切按预期运行
  3. warning : 打印warning,error,critical级别的日志,一个迹象表明一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”)这个软件还能按预期工作
  4. error : 打印error,critical级别的日志,更严重的问题,软件没能执行一些功能
  5. critical : 打印critical级别,一个严重的错误,这表明程序本身可能无法继续运行
logging.debug('This is debug message') # 打印全部日志
logging.info('This is info message') # 打印 info 级别以上的日志
logging.warning('This is warning message') # 打印 warning 级别以上的日志
logging.error('This is error message') # 打印error 级别以上的日志
logging.critical('This is critical message') # 打印critical级别以上的日志

日志输出格式:

Logging.Formatter:这个类配置了日志的格式,在里面自定义设置日期和时间,输出日志的时候将会按照设置的格式显示内容。

format常用格式说明:

  • %(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
import time

logger = logging.getLogger()
logger.setLevel(logging.INFO)
sh = logging.StreamHandler()
sh.setLevel(logging.INFO)
formatter = logging.Formatter(
    '%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
sh.setFormatter(formatter)
logger.addHandler(sh)

i = 0
while i < 10:
    logger.info('logger info:' + str(i))
    i += 1

logger.info('logger info: while over.')

输出为:

2018-07-03 23:38:21,955 - 8.5-log.py[line:15] - INFO: logger info:0
2018-07-03 23:38:21,955 - 8.5-log.py[line:15] - INFO: logger info:1
2018-07-03 23:38:21,955 - 8.5-log.py[line:15] - INFO: logger info:2
2018-07-03 23:38:21,955 - 8.5-log.py[line:15] - INFO: logger info:3
2018-07-03 23:38:21,956 - 8.5-log.py[line:15] - INFO: logger info:4
2018-07-03 23:38:21,956 - 8.5-log.py[line:15] - INFO: logger info:5
2018-07-03 23:38:21,956 - 8.5-log.py[line:15] - INFO: logger info:6
2018-07-03 23:38:21,956 - 8.5-log.py[line:15] - INFO: logger info:7
2018-07-03 23:38:21,956 - 8.5-log.py[line:15] - INFO: logger info:8
2018-07-03 23:38:21,956 - 8.5-log.py[line:15] - INFO: logger info:9
2018-07-03 23:38:21,956 - 8.5-log.py[line:18] - INFO: logger info: while over.

如果需要输出日志到文件,则创建一个文件handler:

import logging
import time

logger = logging.getLogger()
logger.setLevel(logging.INFO)

formatter = logging.Formatter(
    '%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')

rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
log_name = rq + '.log'
fh = logging.FileHandler(log_name, mode='w')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
logger.addHandler(fh)

i = 0
while i < 10:
    logger.info('logger info:' + str(i))
    i += 1

logger.info('logger info: while over.')

结果为:201807032341.log,文件内容为:

2018-07-03 23:41:55,009 - 8.6-logfile.py[line:20] - INFO: logger info:0
2018-07-03 23:41:55,009 - 8.6-logfile.py[line:20] - INFO: logger info:1
2018-07-03 23:41:55,009 - 8.6-logfile.py[line:20] - INFO: logger info:2
2018-07-03 23:41:55,009 - 8.6-logfile.py[line:20] - INFO: logger info:3
2018-07-03 23:41:55,010 - 8.6-logfile.py[line:20] - INFO: logger info:4
2018-07-03 23:41:55,010 - 8.6-logfile.py[line:20] - INFO: logger info:5
2018-07-03 23:41:55,010 - 8.6-logfile.py[line:20] - INFO: logger info:6
2018-07-03 23:41:55,010 - 8.6-logfile.py[line:20] - INFO: logger info:7
2018-07-03 23:41:55,010 - 8.6-logfile.py[line:20] - INFO: logger info:8
2018-07-03 23:41:55,010 - 8.6-logfile.py[line:20] - INFO: logger info:9
2018-07-03 23:41:55,010 - 8.6-logfile.py[line:23] - INFO: logger info: while over.