0

我在为多个对象配置日志记录时遇到问题。

目前,我有两个代表 aserver和 a 的类coordinator。它们的组合使得 acoordinator具有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

谢谢

4

1 回答 1

0

从您的代码片段中不清楚您打算如何初始化您的类(顺序、副本数量等)。我的猜测是您的问题是您正在尝试为每个类记录器配置一个单独的流处理程序。

通常,要使用 python 日志记录,您需要执行以下操作:

1) 在主入口点附近配置日志记录

这包括设置任何处理程序来控制日志消息的去向以及消息的级别。最简单的方法是调用logging.basicConfig(..)。您要确保仅执行一次。您还希望它在您的任何日志记录调用之前发生,因此通常这将是您的 main(..) 函数中的第一件事。

2) 在他们的位置创建和使用记录器

您可以根据需要创建任意数量的记录器,并给它们起任何您想要的名称。为每个模块创建一个 usinglog = 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()

哪个记录到标准错误:

WARNING:Coordinator:In coordinator
WARNING:Server:in server
INFO:websockets:...whatever this library logs...
于 2019-02-06T19:52:24.607 回答