Python的内置模块logging详解

logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:

  • 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
  • print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出

Python 使用logging模块记录日志涉及四个主要类,使用官方文档中的概括最为合适:

  • logger提供了应用程序可以直接使用的接口;

  • handler将(logger创建的)日志记录发送到合适的目的输出;

  • filter提供了细度设备来决定输出哪条日志记录;

  • formatter决定日志记录的最终输出格式。

模块级函数

  • logging.getLogger([name]):返回一个logger对象,如果没有指定名字将返回root logger

  • logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical():设定root logger的日志级别

  • logging.basicConfig():用默认Formatter为日志系统建立一个StreamHandler,设置基础配置并加到root logger中

  • 设置logger的level, level有以下几个级别:
    NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
    如果把looger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出

基本使用

配置logging基本的设置,然后在控制台输出日志:

import logging
logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)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-06-10 15:09:03,001 - __main__ - INFO - Start print log
2018-06-10 15:09:03,015 - __main__ - WARNING - Something maybe fail.
2018-06-10 15:09:03,017 - __main__ - INFO - Finish

logging中可以选择很多消息级别,如debug、info、warning、error以及critical。通过赋予logger或者handler不同的级别,开发者就可以只输出错误信息到特定的记录文件,或者在调试时只记录调试信息 例如,我们将logger的级别改为DEBUG,再观察一下输出结果:

import logging
logging.basicConfig(level = logging.DEBUG,format = '%(asctime)s - %(name)s - %(levelname)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-06-10 15:13:07,300 - __main__ - INFO - Start print log
2018-06-10 15:13:07,315 - __main__ - DEBUG - Do something
2018-06-10 15:13:07,318 - __main__ - WARNING - Something maybe fail.
2018-06-10 15:13:07,325 - __main__ - INFO - Finish

控制台输出,可以发现,输出了debug的信息。
logging.basicConfig函数各参数:

filename:指定日志文件名;

filemode:和file函数意义相同,指定日志文件的打开模式,‘w’或者’a’;

format:指定输出的格式和内容,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:打印日志信息

datefmt:指定时间格式,同time.strftime();

level:设置日志级别,默认为logging.WARNNING;

stream:指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略;

参考

http://www.cnblogs.com/dahu-daqing/p/7040764.html (更高级一点的用法参考这本书)
https://cuiqingcai.com/6080.html (这个写的很好,参考这个)

猜你喜欢

转载自blog.csdn.net/qq_36653505/article/details/83793743