从多个对象中提取日志

时间:2019-02-06 19:35:32

标签: python logging python-logging

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

目前,我有两个类分别代表servercoordinator。这些元素的组成使得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 :(得分:0)

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

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

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

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

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