13.11 给简�脚本增加日志功能¶

问题¶

你希望在脚本和程�中将诊断信�写入日志文件。

解决方案¶

打�日志最简�方�是使用 logging 模�。例如:

import logging

def main():
    # Configure the logging system
    logging.basicConfig(
        filename='app.log',
        level=logging.ERROR
    )

    # Variables (to make the calls that follow work)
    hostname = 'www.python.org'
    item = 'spam'
    filename = 'data.csv'
    mode = 'r'

    # Example logging calls (insert into your program)
    logging.critical('Host %s unknown', hostname)
    logging.error("Couldn't find %r", item)
    logging.warning('Feature is deprecated')
    logging.info('Opening file %r, mode=%r', filename, mode)
    logging.debug('Got here')

if __name__ == '__main__':
    main()

上�五个日志调用(critical(), error(), warning(), info(), debug())以��方�表示��的严�级别。 basicConfig() 的 level �数是一个过滤器。 所有级别低于此级别的日志消�都会被忽略掉。 �个logging�作的�数是一个消�字符串,���跟一个或多个�数。 构造最终的日志消�的时候我们使用了%�作符�格�化消�字符串。

�行这个程��,在文件 app.log 中的内容应该是下�这样:

CRITICAL:root:Host www.python.org unknown
ERROR:root:Could not find 'spam'

如果你想改�输出等级,你�以修改 basicConfig() 调用中的�数。例如:

logging.basicConfig(
     filename='app.log',
     level=logging.WARNING,
     format='%(levelname)s:%(asctime)s:%(message)s')

最�输出��如下:

CRITICAL:2012-11-20 12:27:13,595:Host www.python.org unknown
ERROR:2012-11-20 12:27:13,595:Could not find 'spam'
WARNING:2012-11-20 12:27:13,595:Feature is deprecated

上�的日志�置都是硬编�到程�中的。如果你想使用�置文件, �以�下�这样修改 basicConfig() 调用:

import logging
import logging.config

def main():
    # Configure the logging system
    logging.config.fileConfig('logconfig.ini')
    ...

创建一个下�这样的文件,�字� logconfig.ini :

[loggers]
keys=root

[handlers]
keys=defaultHandler

[formatters]
keys=defaultFormatter

[logger_root]
level=INFO
handlers=defaultHandler
qualname=root

[handler_defaultHandler]
class=FileHandler
formatter=defaultFormatter
args=('app.log', 'a')

[formatter_defaultFormatter]
format=%(levelname)s:%(name)s:%(message)s

如果你想修改�置,�以直接编辑文件logconfig.ini��。

讨论¶

尽管对于 logging 模�而已有很多更高级的�置选项, �过这里的方案对于简�的程�和脚本已�足够了。 �想在调用日志�作�先执行下basicConfig()函数方法,你的程�就能产生日志输出了。

如果你想�你的日志消�写到标准错误中,而�是日志文件中,调用 basicConfig() 时�传文件��数��。例如:

logging.basicConfig(level=logging.INFO)

basicConfig() 在程�中�能被执行一次。如果你��想改�日志�置, 就需�先获� root logger ,然�直接修改它。例如:

logging.getLogger().level = logging.DEBUG

需�强调的是本节�是演示了 logging 模�的一些基本用法。 它�以�更多更高级的定制。 关于日志定制化一个很好的资�是 Logging Cookbook