You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rtpengine/python/pysip_lite/Logger.py

40 lines
1.1 KiB

import asyncio
import typing
from ._Waiter import Waiter
from ._lib import *
class Logger:
"""Registers a callback to receive log messages and sets the log level.
The object must be "await"ed for to close the logging context.
:param fn: callable (taking one string argument) to pass log messages to
:param log_level: belle-sip log level (1 for full debug)
"""
_fn: typing.Callable[[str], None] = None
_w: Waiter = None
_t: asyncio.Task = None
def __init__(self, fn: typing.Callable[[str], None], log_level: int = 4):
self._fn = fn
self._w = Waiter()
self._t = asyncio.create_task(self._wait())
lib.bsw_set_logger(log_level, self._w.fd())
async def _wait(self):
while self._w:
ok: bool = await self._w.wait()
if not ok:
break
s = c_char_p(b"\0" * 8192)
ok = lib.bsw_get_log(s, 8192)
if ok:
self._fn(s.value.decode())
def __await__(self) -> None:
self._w.close() # wakes up _wait()
yield from self._t