从多个对象中提取日志记录
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...
我在为多个对象配置日志记录时遇到问题。
目前,我有两个 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...