从多个对象中提取日志记录

Extract logging from multiple objects

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

目前,我有两个 classes 代表一个 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 class 之前,server class 中的日志能够提取 websockets 值并显示输出。

这不再有效。我该如何解决这个问题,并向 Coordinator class?

添加一个额外的记录器

我正在使用 python 3.6.8

谢谢

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

一般来说,要使用 python 日志记录,您需要执行以下操作:

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

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

2) 在其位置创建和使用记录器

您可以根据需要创建任意数量的记录器,并为它们指定任意名称。使用 log = logging.getLogger(__name__) 为每个模块创建一个是开始的好方法,但如果您愿意,也可以按 class 来代替。

示例:

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...