Python logging 模块使用指南

记录日志是追踪事件的一种手段。经过添加日志,开发者能够清楚地了解发生了哪些事件,包括出现了哪些错误。logging 模块提供了一系列便捷的函数,用于简单的日志记录。它们分别是 debug(), info(), warning(), error()critical()javascript

简单示例

下面是一个很是简单的示例:html

import logging
logging.warning('Watch out!')   # 打印一条信息到命令行
logging.info('I told you so')   # 不会打印任何东西复制代码

若是你运行着几行代码,你会看到命令行中输出如下内容:java

WARNING:root:Watch out!复制代码

因为 logging 模块默认的级别为 WARNING,所以 INFO 级别的日志不会被打印出来。输出的日志包含了级别和事件的描述。root 为默认 logger 的名字,咱们能够手动更改它,而且自定义日志的输出格式。python

记录日志到文件

不少状况下,咱们会把日志记录到文件中,接下来咱们就来看看具体的操做。请从新打开一个 python 解释器,而不要直接使用上述例子所用的解释器,确保 logging 模块可以被正确配置。app

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复制代码

这个例子告诉你如何设定日志级别,从而控制要记录的日志。因为咱们在这个例子中设定的级别是 DEBUG,所以全部的日志都会被记录下来。函数

多个模块记录日志

若是你的程序包含了多个模块,这里有一个例子向你展现了如何组织它们的日志输出:ui

# 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 文件,你会在 myapp.log 文件中看到如下内容:this

INFO:root:Started
INFO:root:Doing something
INFO:root:Finished复制代码

记录变量的数据

要记录变量的数据,可使用一个格式串来格式化输出,并将变量做为参数传递给日志记录函数。spa

import logging
logging.warning('%s before you %s', 'Look', 'leap!')复制代码

输出内容:

WARNING:root:Look before you leap!复制代码

你也可使用 python 自带的字符串格式化函数:

import logging
logging.warning('{} before you {}'.format('Look', 'leap!'))复制代码

自定义日志格式

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复制代码

注意到以前的例子中出现的 root 在这里已经消失了。要了解全部能出如今格式串里的东西,请参考 LogRecord attributes。但若是只是简单使用,你只须要 levelname(级别)、message(事件描述,包括变量数据)以及事件发生的时间,这点将在下面讲解。

记录日期和时间

要在日志中显示日期和时间,你须要在格式串中加入 %(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.复制代码

格式串中的时间格式参数与 time.strftime() 中支持的参数相同。

logging 进阶指南

logging 模块采起了模块化的方式并提供了几个组件的类别:logger、handler、filter、formatter。

  • logger 提供了代码中直接使用的接口
  • handler 用于向目的地发送日志记录
  • filter 用于过滤特定的日志记录
  • formatter 指定了日志记录最终的输出样式

日志事件信息在一个 LogRecord 实例中的 logger、handler、filter 和 formatter 之间传递。

一个给 logger 命名的好习惯是使用模块级别的 logger。在每个须要记录日志的模块内使用如下方式来给 logger 命名:

logger = logging.getLogger(__name__)复制代码

这种状况下,logger 的名字会追踪包/模块的层次结构,而且咱们能够直观地看到事件是由哪一个模块记录的。

层次结构中最顶级的 logger 称为 root logger。当咱们调用 logging 模块的 debug(), info(), warning(), error()critical() 函数时,会使用 root logger 对应的同名方法。这些函数与 root logger 中的同名方法具备相同的参数签名。root logger 在输出时名字为 root

固然,咱们也能够将信息记录到不一样的目的地。咱们能够将日志记录到文件、HTTP GET/POST 位置、邮件(经过 SMTP)、普通套接字或系统专用的日志机制,例如 syslog 或 Windows NT 事件日志。目的地由 handler 类进行处理。若是内置的 handler 类没有知足你的要求,你能够建立一个本身的日志目的地类。

默认状况下,不会给日志信息设定目的地。你可使用 basicConfig() 来指定目的地,正如以前所给的例子同样。若是你调用了 debug(), info(), warning(), error()critical() 函数,它们会检查是否设定了目的地,若是未设定目的地,则默认使用命令行(sys.stderr)做为目的地,并使用默认的格式来显示信息。

basicConfig() 函数默认的格式为:

severity:logger name:message复制代码

你能够经过传递一个格式串以及格式参数给 basicConfig() 来改变输出格式。关于格式串构建的全部选项,请参考 Formatter Objects

参考文章:Logging HOWTO

做者:Wray Zheng
原文连接: www.codebelief.com/article/201…

相关文章
相关标签/搜索