我正在尝试实现一个简单的日志处理程序,该程序使用Python的标准 logging
库将事件记录到远程服务器。因此,我创建了一个自定义类,继承自 logging.Handler
,名为 RemoteLogHandler
,它接受 LogRecord
并将其发送到远程服务器。该处理程序以标准的 addHandler()
方式附加到根记录器。
from urllib import requests
class RemoteLogHandler(logging.Handler):
def emit(self, record):
remote_url = "http://foo.bar.baz"
req = request.Request(remote_url, data=record.msg)
request.urlopen(req, timeout=1)
这个功能是按预期工作的,但当remote_url变得无法访问或响应变慢时,显然会导致调用线程被锁定。因此,我正在尝试找到使此调用与调用线程无关的最佳方法。
我考虑了以下几种方案:
1.包括某些非标准库,使http请求异步化 2.使用QueueHandler和QueueListener,如这里所述 3.使用asyncio
所有这些解决方案似乎都过于复杂/不必要,无法实现如此简单的任务。是否有更好的方法可以减少开销,使此处理程序非阻塞?