Извлечь запись из нескольких объектов

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

В настоящее время у меня есть два класса, представляющих 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 ответ

Решение

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

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

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...
Другие вопросы по тегам