import asyncio import logging from nio import AsyncClient, MatrixRoom, RoomMessageText class MatrixHandler(logging.Handler): def __init__(self, url, user_id, user_password, room_id): super().__init__() self.client = AsyncClient(url, user_id) self.room_id = room_id self.client.add_event_callback(self.message_callback, RoomMessageText) await self.client.login(user_password) def message_callback(self, room: MatrixRoom, event: RoomMessageText) -> None: return def emit(self, record): self.client.room_send( self.room_id, message_type='m.room.message', content={'msgtype': 'm.text', 'body': record} ) class MatrixLogger: def __init__(self, name): self.logger = logging.getLogger(name) self.logger.setLevel(logging.DEBUG) console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) console_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')) matrix_handler = MatrixHandler(room_id) matrix_handler.setLevel(logging.INFO) matrix_handler.setFormatter(logging.Formatter('%(levelname)s - %(message)s')) self.logger.addHandler(console_handler) self.logger.addHandler(matrix_handler) def debug(self, message): self.logger.debug(message) def info(self, message): self.logger.info(message) def warning(self, message): self.logger.warning(message) def error(self, message): self.logger.error(message) def critical(self, message): self.logger.critical(message)