4

我在uvicorn源代码中看到了一个 python dict 日志配置。

在那里,他们将格式化程序定义为

{
    "default": {
        "()": "uvicorn.logging.DefaultFormatter",
        "fmt": "%(levelprefix)s %(asctime)s %(message)s",
        "datefmt": "%Y-%m-%d %H:%M:%S",

    },
    "access": {
        "()": "uvicorn.logging.AccessFormatter",
        "fmt": '%(levelprefix)s %(asctime)s :: %(client_addr)s - "%(request_line)s" %(status_code)s',
        "use_colors": True
    },
}

另外,我们可以看到,他们定义了一个空记录器(不知道我应该怎么称呼它),

"": {"handlers": ["default"], "level": "INFO"},
^^^^ - see, Empty key

所以,这是我的问题,

  1. python 记录器的格式化程序部分"()"做什么?
  2. loggers部分 python logger""中的作用是什么?
4

1 回答 1

5

该字典用于配置日志记录logging.config.dictConfig()

"()"键表示需要自定义实例化 [ source ]

在下面提到“配置字典”的所有情况下,将检查特殊的“()”键以查看是否需要自定义实例化。如果是这样,则使用下面用户定义的对象中描述的机制来创建实例;否则,上下文用于确定要实例化的内容。

对于 OP 问题中的格式化程序配置,"()"表示这些类应该用于实例化Formatter.

我在字典的记录器部分没有看到空字符串,但这里是相关文档

loggers- 对应的值将是一个字典,其中每个键是一个记录器名称,每个值是一个描述如何配置相应记录器实例的字典。

在配置字典中搜索以下键:

  • level(可选的)。记录器的级别。
  • propagate(可选的)。记录器的传播设置。
  • filters(可选的)。此记录器的过滤器 ID 列表。
  • handlers(可选的)。此记录器的处理程序的 ID 列表。

指定的记录器将根据指定的级别、传播、过滤器和处理程序进行配置。

所以字典""中的一个键将实例化一个名称为 的记录器,例如.loggers""logging.getLogger("")


出于各种原因,人们可能会使用自定义日志格式化程序。uvicorn使用自定义格式化程序以不同颜色记录不同级别。Python Logging Cookbook 有一个使用自定义格式化程序在记录消息中使用 UTC 时间而不是本地时间的示例。

import logging
import time

class UTCFormatter(logging.Formatter):
    converter = time.gmtime

LOGGING = {
    ...
    'formatters': {
        'utc': {
            '()': UTCFormatter,
            'format': '%(asctime)s %(message)s',
        },
        'local': {
            'format': '%(asctime)s %(message)s',
        }
    },
    ...
}

if __name__ == '__main__':
    logging.config.dictConfig(LOGGING)
    logging.warning('The local time is %s', time.asctime())

这是输出。请注意,在第一行中,使用 UTC 时间而不是本地时间,因为UTCFormatter使用的是 。

2015-10-17 12:53:29,501 The local time is Sat Oct 17 13:53:29 2015
2015-10-17 13:53:29,501 The local time is Sat Oct 17 13:53:29 2015
于 2020-07-17T14:25:39.633 回答