登录中

../_images/35254379756_c9fe23f843_k_d.jpg

这个 logging 模块自2.3版以来一直是Python标准库的一部分。它在 PEP 282 .众所周知,文档很难阅读,除了 basic logging tutorial .

作为替代方案, loguru 提供了一种日志记录方法,几乎与使用简单的 print 语句。

日志记录有两个用途:

  • 诊断日志记录 记录与应用程序操作相关的事件。例如,如果用户调用报告错误,则可以搜索日志中的上下文。

  • 审核日志记录 记录用于业务分析的事件。可以提取用户的事务,并将其与报表的其他用户详细信息结合起来,或者优化业务目标。

…… 还是打印?

唯一一次 print 当目标是显示命令行应用程序的帮助语句时,日志记录比日志记录更好。日志记录优于 print

  • 这个 log record 它与每个日志事件一起创建,包含随时可用的诊断信息,例如日志事件的文件名、完整路径、函数和行号。

  • 登录到包含模块中的事件可以通过根日志记录器自动访问应用程序的日志流,除非您过滤掉它们。

  • 使用该方法可以选择性地抑制测井。 logging.Logger.setLevel() 或通过设置属性禁用 logging.Logger.disabledTrue .

登录库

注意事项 configuring logging for a librarylogging tutorial .因为 user 而不是库,应该规定当日志事件发生时会发生什么,一条警告意味着重复:

注解

强烈建议您不要将nullHandler以外的任何处理程序添加到库的记录器中。

在库中实例化记录器时的最佳实践是只使用 __name__ 全局变量: logging 模块使用点表示法创建记录器的层次结构,因此使用 __name__ 确保没有名称冲突。

下面是来自 requests source --把这个放在你的 __init__.py

import logging
logging.getLogger(__name__).addHandler(logging.NullHandler())

登录应用程序

这个 twelve factor app 是应用程序开发中良好实践的权威参考,包含一节 logging best practice .它强调将日志事件视为事件流,并将该事件流发送到由应用程序环境处理的标准输出。

至少有三种配置记录器的方法:

  • 使用INI格式的文件:
    • Pro :使用函数运行时可以更新配置 logging.config.listen() 在插座上听。

    • Con :在代码中配置记录器时,控件(例如自定义子类筛选器或记录器)可能会更少。

  • 使用字典或JSON格式的文件:
    • Pro :除了在运行时进行更新外,还可以使用 json 模块,在Python2.6之后的标准库中。

    • Con :比在代码中配置记录器时控制更少。

  • 使用代码:
    • Pro :完全控制配置。

    • Con :修改需要更改源代码。

通过ini文件配置示例

假设文件名为 logging_config.ini .有关文件格式的详细信息,请参见 logging configuration 剖面图 logging tutorial .

[loggers]
keys=root

[handlers]
keys=stream_handler

[formatters]
keys=formatter

[logger_root]
level=DEBUG
handlers=stream_handler

[handler_stream_handler]
class=StreamHandler
level=DEBUG
formatter=formatter
args=(sys.stderr,)

[formatter_formatter]
format=%(asctime)s %(name)-12s %(levelname)-8s %(message)s

然后使用 logging.config.fileConfig() 在代码中:

import logging
from logging.config import fileConfig

fileConfig('logging_config.ini')
logger = logging.getLogger()
logger.debug('often makes a very good meal of %s', 'visiting tourists')

通过字典配置示例

从python 2.7开始,您可以使用带有配置详细信息的字典。 PEP 391 包含配置字典中强制和可选元素的列表。

import logging
from logging.config import dictConfig

logging_config = dict(
    version = 1,
    formatters = {
        'f': {'format':
              '%(asctime)s %(name)-12s %(levelname)-8s %(message)s'}
        },
    handlers = {
        'h': {'class': 'logging.StreamHandler',
              'formatter': 'f',
              'level': logging.DEBUG}
        },
    root = {
        'handlers': ['h'],
        'level': logging.DEBUG,
        },
)

dictConfig(logging_config)

logger = logging.getLogger()
logger.debug('often makes a very good meal of %s', 'visiting tourists')

直接在代码中配置示例

import logging

logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter(
        '%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

logger.debug('often makes a very good meal of %s', 'visiting tourists')