Извлечь запись из нескольких объектов - PullRequest
0 голосов
/ 06 февраля 2019

У меня проблема с настройкой ведения журнала для нескольких объектов.

В настоящее время у меня есть два класса, представляющих server и coordinator.Они составлены так, что coordinator имеет server как в переменной экземпляра.

См. Ниже:

class Coordinator(object):
    def __init__(self):
        self.scheduler = asyncio.get_event_loop()
        self.server = Server(..)


class Server(object):
    def __init__(self, scheduler, host, port):

        ...

        # Configure WebSocket logging
        self.logger = logging.getLogger('websockets')
        self.logger.setLevel(logging.DEBUG)
        self.logger.addHandler(logging.StreamHandler())

        ...

До того, как я добавил класс coordinator, регистрация в классе server смогла извлечь значения websockets и отобразить вывод.

Это больше не работает.Как я могу решить эту проблему и добавить дополнительный регистратор в класс Coordinator?

Я использую python 3.6.8

Спасибо

1 Ответ

0 голосов
/ 06 февраля 2019

Из вашего фрагмента кода неясно, как именно вы собираетесь инициализировать свои классы (порядок, количество копий и т. Д.).Я думаю, что ваша проблема в том, что вы пытаетесь настроить отдельный обработчик потока для каждого регистратора классов.

В общем, для использования регистрации в Python вы хотите сделать следующее:

1) Настроить ведение журнала рядом с вашей основной точкой входа

Это состоит из настройки любых обработчиков для управления тем, куда будут отправляться сообщения журнала и какие уровни сообщений.Самый простой способ сделать это - позвонить logging.basicConfig (..) .Вы хотите, чтобы это было сделано один раз и только один раз.Кроме того, вы хотите, чтобы это происходило перед любыми вашими вызовами регистрации, поэтому обычно это будет одной из первых вещей в вашей главной (..) функции.

2) Создание и использование регистраторов на их месте

Вы можете создать столько регистраторов, сколько захотите, и дать им любое имя, какое захотите.Создание одного для модуля с использованием log = logging.getLogger(__name__) - хороший способ начать, но вы можете вместо этого сделать это для каждого класса.

Пример:

import logging


class Coordinator(object):
    def __init__(self):
        self.logger = logging.getLogger('Coordinator')
        self.server = Server()

    def do_whatever(self):
        self.logger.warn("In coordinator")
        self.server.do_whatever()


class Server(object):
    def __init__(self):
        self.logger = logging.getLogger('Server')

    def do_whatever(self):
        self.logger.warn("in server")


if __name__ == '__main__':
    # Logs to stderr by default all messages DEBUG or higher
    logging.basicConfig(level=logging.DEBUG)

    # Set the logging level specifically for the websockets log object
    logging.getLogger('websockets').setLevel(logging.INFO)

    c = Coordinator()
    c.do_whatever()

Какойлоги в stderr:

WARNING:Coordinator:In coordinator
WARNING:Server:in server
INFO:websockets:...whatever this library logs...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...