Python 模块之Logging(一)——Logging HOWTO译文

原文地址:Python 模块 Logging HOWTO 官方文档

一、Lgging简介

Logging是一种当软件运行时对事件的追踪记录方式,软件开发者通过在代码中调用Logging的相关方法来提示某些事件的发生。事件可以通过描述信息描述,当然描述信息中也可以包含变量,因为对于事件的每次触发,描述信息可能不同。

二、简单的例子

一个简单的例子:

import logging
logging.warning('Watch out!')  # 信息会打印到控制台
logging.info('I told you so')  # 不会打印任何信息,因为默认级别高于info

如果你将上述代码存入python文件,然后运行:

WARNING:root:Watch out!

INFO的信息没有出现在控制台,因为默认的级别为WARNING高于INFO。日志信息包含日志级别和事件描述信息,暂且别太在意输出中的root,稍后会有介绍。实际的输出可以让你任意的定制,格式设置会在稍后介绍。

三、将日志信息存入文件

在应用中我们常常需要将日志信息存入文件。请重新创建一个新文件,不要接在上面的python文件中。

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

并且 你也可以获取传递给–log的参数,你可以这样做:

getattr(logging, loglevel.upper())

你可以通过basicConfig()方法来设置日志级别——传递level参数。你可能想要检查level参数值的合法性,可以像下面这样:

# assuming loglevel is bound to the string value obtained from the
# command line argument. Convert to upper case to allow the user to
# specify --log=DEBUG or --log=debug
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, ...)

basicConfig()方法的调用先于debug(),info()等方法。因为它是一次性的工作:第一次调用是有效的,后面的调用都是无效的空操作。

如果你多次运行上面的代码,日志信息会追加到原有的日志信息上。如果你想要每次的日志信息都覆盖掉之前的,那么可以通过配置filemode参数为’w’即可:

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

新的日志信息会覆盖掉旧的。

四、多模块Logging

如果你的工程包含多个模块,你可以像下面的这种方式组织logging:

# 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,你会在myqpp.log中看到如下信息:

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

这正是你想要看到的。你可以将他们组织到你的多个模块中,通过使用mylib.py的模板。注意:使用这种方式,除了通过查看事件描述,你不能判断这个信息从何而来。如果你想要追踪信息来源,你需要参照更加高级的教程-Logging进阶

五、Logging变量信息

为了生成包含变量的日志,你需要使用格式化的字符串,通过将变量当成参数传递给描述信息,例如:

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

会生成:

WARNING:root:Look before you leap!

正如你看到的,通过使用格式化字符创将变量合并到描述信息中。这种方式是向后兼容的:logging包中有更新的格式化可选方法,例如str.format() and string.Template。这些新的格式化方法都是支持的,但是研究它们的使用不在本文的讨论范围内。

六、修改显示日志信息的格式

你可以更改显示日志信息的格式,像这样:

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的文档。但是对于简单的应用,你只需要知道日志级别,日志信息(包含变量的日志信息),或者再加上事件的发生时间。这些将在下一节中讲到。

七、在日志信息中显示日期时间

为了在日志信息中显示日期时间,你需要使用%(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。如果你想要定制自己的格式,可以通过传递参数datefmt给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.   

datefmt参数的格式和time.strftime()是相似的。

以上是Logging 的基础教程,如果你的需求比较简单,上面介绍的用法应该能够满足你的需求。

如果想更深入了解Logging模块请转到Logging高级教程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值