Python: Это хорошая идея, чтобы передать регистратор? - PullRequest
1 голос
/ 22 апреля 2019

Мой API веб-сервера регистрируется так:

started
started
succeeded
failed

Это два запроса, полученных одновременно. Трудно сказать, кто из них преуспел или потерпел неудачу. Чтобы отделить запросы друг от друга, я создал случайное число для каждого и использовал его в качестве имени регистратора

logger = logging.getLogger(random_number)

Логи стали

[111] started
[222] started
[111] succeeded
[222] failed

Теперь все выглядит ясно, но проблема этого подхода в том, что мне нужно передать регистратор каждому связанному классу, например так:

def __init__(self, logger):
    self._logger = logger

Итак, вопрос:

  1. Это лучший способ регистрировать контекст каждого запроса?
  2. Если это так, будет ли хорошей идеей передать регистратор? Есть ли способ сделать код менее подробным?

1 Ответ

0 голосов
/ 22 апреля 2019

Вы не должны генерировать новый регистратор для каждого запроса. Вы должны определить уникальный атрибут запроса (IP-адрес клиента, URL-адрес, идентификатор сеанса, некоторый токен cookie ...) и добавить его в оператор журнала. Таким образом, вы сможете связать различные записи журнала одного запроса в выводе журнала.

Кроме того, журналы не должны передаваться. Атрибут name из logging.getLogger(name) должен использоваться для получения одного и того же регистратора из разных мест в коде.

Лучше прочитать подробнее о регистрации, например, здесь https://docs.python.org/3/library/logging.html где вы можете найти полезный пример с IP-адресом клиента:

FORMAT = '%(asctime)-15s %(clientip)s %(user)-8s %(message)s'
logging.basicConfig(format=FORMAT)
d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}
logger = logging.getLogger('tcpserver')
logger.warning('Protocol problem: %s', 'connection reset', extra=d)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...