import asyncio import logging import os from nio import AsyncClient, MatrixRoom, RoomMessageText class MatrixHandler(logging.Handler): def __init__(self): super().__init__() self.address = os.getenv('MATRIX_HOMESERVER_ADDRESS') self.user_id = os.getenv('MATRIX_USER_ID') self.user_password = os.getenv('MATRIX_USER_PASSWORD') self.room_id = os.getenv('MATRIX_ROOM_ID') self.device_id = os.getenv('MATRIX_DEVICE_ID') def message_callback(self, room: MatrixRoom, event: RoomMessageText) -> None: return async def send_to_matrix(self, record): client = AsyncClient(self.address, self.user_id) await client.login(self.user_password, self.device_id) client.add_event_callback(self.message_callback, RoomMessageText) await client.room_send( self.room_id, message_type='m.room.message', content={'msgtype': 'm.text', 'body': self.formatter.format(record)} ) def emit(self, record): asyncio.run(self.send_to_matrix(record)) class MatrixLogger: def __init__(self, name): self.log = logging.getLogger(name) self.log.setLevel(os.getenv('LOG_LEVEL', 'INFO')) console_handler = logging.StreamHandler() console_handler.setLevel(os.getenv('LOG_LEVEL', 'INFO')) console_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')) matrix_handler = MatrixHandler() matrix_handler.setLevel(os.getenv('LOG_LEVEL', 'INFO')) matrix_handler.setFormatter(logging.Formatter('%(levelname)s - %(name)s - %(message)s')) self.log.addHandler(console_handler) self.log.addHandler(matrix_handler) def debug(self, message): self.log.debug(message) def info(self, message): self.log.info(message) def warning(self, message): self.log.warning(message) def error(self, message): self.log.error(message) def critical(self, message): self.log.critical(message)