Python 日志(logging)模块

来源:互联网 发布:php api 框架 编辑:程序博客网 时间:2024/05/16 04:56

对于小型项目而言,大家习惯于使用print语句打印信息到终端进行调试,然而,当项目代码量扩大到了一定级别后,打印调试的方法就显得很凌乱了,更重要的是,当debug完成后,甄别并删除(或注释)调试用的打印语句变得非常令人头痛。而使用日志模块则能很好地解决这些问题。

1. 什么是日志

日志(logging)是在程序运行过程中对发生的事件的追踪、记录。程序开发者们在代码中引入日志模块以指示某种特定事件的发生,而这些事件可以依据重要程度划分为不同的层级,比如一般信息(info),警告(warning),错误(error)等。

2. 如何使用日志模块

Python的日志模块提供了一系列的函数用来记录不同的日志信息,包括’debug()’,info(),warning,error(),critical()等,下面的表对不同的函数适用范围做了说明:

任务 合适的工具 打印脚本信息或代码信息到控制台 print() 在程序正常运行时发生的报告事件(例如状态监测或故障调查) logging.info()(或者在诊断时使用logging.debug())输出详细的信息 在运行出现问题时发出警告信息 logging.warning() 对特定的运行时事件报告错误 抛出异常 不引发异常的错误报告 比如长时间运行的服务器进程中的错误处理程序

这些函数都是根据追踪事件的级别和严重程度来命名的。如下所示:

级别 使用场景 DEBUG 并且只在调试程序时关心的程序运行详细信息 INFO 确认程序像预期一样工作 WARNING 指示超出预期的事件的发生或未来的将发生的问题 ERROR 由于一些严重的问题,程序不能执行某些特定的函数 CRITICAL 严重的错误,用来指示程序将不能继续运行下去

默认的层级是WARNING,即只追踪警告及其以上的事件发生,比如下面的简单的例子:

import logginglogging.warning('Watch out!') # 将会在终端打印信息logging.info('I told you so') # 不会打印任何信息

运行结果:
WARNING:root:Watch out!

3.将日志记录到文件中

import logginglogging.basicConfig(filename='example.log',level=logging.DEBUG)logging.debug('This message should go to the log file')logging.info('So should this')logging.warning('And this, too')

执行上面的代码,然后打开example.log文件,将会看到下面的内容:

DEBUG:root:This message should go to the log fileINFO:root:So should thisWARNING:root:And this, too

这段代码也对如何设置日志层级进行了说明。其实,也可以通过命令行的方式设置:
--log=INFO
然后加入下面的代码读到设置好的层级信息:

numeric_level = getattr(logging, loglevel.upper(), None)if not isinstance(numeric_level, int):          raise ValueError('Invalid log level: %s' % loglevel)logging.basicConfig(level=numeric_level, ...)

如果不断运行上面的程序,新的日志将追加到旧的日志之后,这会变得越来越庞大,可以通过下面的方法使新的日志覆盖旧的日志:

logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)

4.从多个模块收集日志信息

下面的代码演示了当你的程序由多个模块组成时管理日志的方法:
# myapp.py

import loggingimport mylibdef main():    logging.basicConfig(filename='myapp.log', level=logging.INFO)    logging.info('Started')    mylib.do_something()    logging.info('Finished')if __name__ == '__main__':    main()

# mylib.py

    import loggingdef do_something():    logging.info('Doing something')

运行myapp.py的结果:

INFO:root:StartedINFO:root:Doing somethingINFO:root:Finished

5. 记录变量信息

可以使用格式化字符串的方法记录变量:

import logginglogging.warning('%s before you %s', 'Look', 'leap!')

除了上面的方法外,也可以使用str.format()和string.Template方法。

6.改变日志格式

import logginglogging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)logging.debug('This message should appear on the console')logging.info('So should this')logging.warning('And this, too')

输出:

DEBUG:This message should appear on the consoleINFO:So should thisWARNING:And this, too

7. 显示日期时间

在格式化输出信息中引入(asctime)s来显示时间:

import logginglogging.basicConfig(format='%(asctime)s %(message)s')logging.warning('is when this event was logged.')

输出:

2010-12-12 11:41:42,612 is when this event was logged.

默认的日期格式是ISO8601,你也可以在basicConfig中进行改变:

import logginglogging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')logging.warning('is when this event was logged.')

输出:

12/12/2010 11:46:36 AM is when this event was logged.

除此之外,还可以使用time.strftime()来改变时间格式。

更高级的使用方法请看官方教程 Advanced Logging Tutorial

关注微信公众号IT练功房,分享最新IT资讯,学习编程技能,让我们共同进步!
IT练功房

0 0