登录中

../_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 .

登录库

注意事项 配置库的日志记录logging tutorial。因为 user 而不是库,应该规定当日志事件发生时会发生什么,一条警告意味着重复:

备注

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

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

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

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

登录应用程序

这个 十二因素应用 是应用程序开发中良好实践的权威参考,包含一节 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')