繁体   English   中英

使用 async emit 创建一个 logging.Handler

[英]Making a logging.Handler with async emit

我有一个 Python 日志处理程序,它使用 asyncio 写入(以任何其他方式写入此特定服务的工作量太大)。 我还希望能够记录来自后台线程的消息,因为一些代码可以做到这一点。 所以我的代码基本上是这样的(最小版本):

class AsyncEmitLogHandler(logging.Handler):
    def __init__(self):
        self.loop = asyncio.get_running_loop()
        super().__init__()

    def emit(self, record):
        self.format(record)
        asyncio.run_coroutine_threadsafe(
            coro=self._async_emit(record.message),
            loop=self.loop,
        )

    async def _async_emit(message):
        await my_async_write_function(message)

大多数情况下它工作正常但是当进程退出时我收到很多这样的警告:“coroutine 'AsyncEmitLogHandler._async_emit' was never awaited”

关于更清洁的方法有什么建议吗? 或者某种方式来捕获关闭并杀死挂起的写入? 或者只是抑制警告?

注意:完整代码在[此处][1][1]:https://github.com/lsst-ts/ts_salobj/blob/c0c6473f7ff7c71bd3c84e8e95b4ad7c28e67721/python/lsst/ts/salobj/sal_log_handler.py

您可以保留对 coro 的引用,并覆盖处理程序的close()方法以在其上调用close() 管理 coros 的一般方法是在处理程序中保留它们的列表,并覆盖处理程序的close()方法以在每个 coro 上调用close() ,或者从它们创建任务并在每个任务上调用cancel() .

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM