Python 日志(logging)模块

对于小型项目而言,大家习惯于使用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 logging
logging.warning('Watch out!') # 将会在终端打印信息
logging.info('I told you so') # 不会打印任何信息

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

3.将日志记录到文件中

import logging
logging.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 file
INFO:root:So should this
WARNING: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 logging
import mylib

def 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 logging
def do_something():
    logging.info('Doing something')

运行myapp.py的结果:

INFO:root:Started
INFO:root:Doing something
INFO:root:Finished

5. 记录变量信息

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

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

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

6.改变日志格式

import logging
logging.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 console
INFO:So should this
WARNING:And this, too

7. 显示日期时间

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

import logging
logging.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 logging
logging.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资讯,学习编程技能,让我们共同进步!
Python 日志(logging)模块_第1张图片

你可能感兴趣的:(python)