| import os |
| import threading |
| from logging import Logger |
|
|
|
|
| class LogPipe(threading.Thread): |
| def __init__( |
| self, |
| level, |
| logger: Logger, |
| identifier=None, |
| callback=None, |
| ) -> None: |
| threading.Thread.__init__(self) |
| self.daemon = True |
| self.level = level |
| self.fd_read, self.fd_write = os.pipe() |
| self.identifier = identifier |
| self.logger = logger |
| self.callback = callback |
| self.reader = os.fdopen(self.fd_read) |
| self.start() |
|
|
| def fileno(self): |
| return self.fd_write |
|
|
| def run(self) -> None: |
| for line in iter(self.reader.readline, ""): |
| if self.callback: |
| self.callback(line.strip()) |
| self.logger.log(self.level, f"[{self.identifier}] {line.strip()}") |
|
|
| self.reader.close() |
|
|
| def close(self) -> None: |
| os.close(self.fd_write) |
|
|