From 6ee0c7600be3d87ba2cec419586250efae971f4b Mon Sep 17 00:00:00 2001 From: Kangwook Lee Date: Mon, 2 Aug 2021 03:19:43 +0900 Subject: [PATCH] Add HookableInMemoryHandler logging handler --- .gitignore | 2 +- qt_ui/logging_config.py | 19 +++++++++++++++---- qt_ui/logging_handler.py | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 qt_ui/logging_handler.py diff --git a/.gitignore b/.gitignore index b9205033..7d556efc 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,7 @@ env/ /liberation_preferences.json /state.json -logs/ +/logs/ qt_ui/logs/liberation.log diff --git a/qt_ui/logging_config.py b/qt_ui/logging_config.py index ea08efe3..8d7a26af 100644 --- a/qt_ui/logging_config.py +++ b/qt_ui/logging_config.py @@ -3,6 +3,8 @@ import logging import os from logging.handlers import RotatingFileHandler +from qt_ui.logging_handler import HookableInMemoryHandler + def init_logging(version: str) -> None: """Initializes the logging configuration.""" @@ -10,13 +12,22 @@ def init_logging(version: str) -> None: os.mkdir("logs") fmt = "%(asctime)s :: %(levelname)s :: %(message)s" + formatter = logging.Formatter(fmt) + logging.basicConfig(level=logging.DEBUG, format=fmt) logger = logging.getLogger() - handler = RotatingFileHandler("./logs/liberation.log", "a", 5000000, 1) - handler.setLevel(logging.DEBUG) - handler.setFormatter(logging.Formatter(fmt)) + rotating_file_handler = RotatingFileHandler( + "./logs/liberation.log", "a", 5000000, 1 + ) + rotating_file_handler.setLevel(logging.DEBUG) + rotating_file_handler.setFormatter(formatter) - logger.addHandler(handler) + hookable_in_memory_handler = HookableInMemoryHandler() + hookable_in_memory_handler.setLevel(logging.DEBUG) + hookable_in_memory_handler.setFormatter(formatter) + + logger.addHandler(rotating_file_handler) + logger.addHandler(hookable_in_memory_handler) logger.info(f"DCS Liberation {version}") diff --git a/qt_ui/logging_handler.py b/qt_ui/logging_handler.py new file mode 100644 index 00000000..465e4cb1 --- /dev/null +++ b/qt_ui/logging_handler.py @@ -0,0 +1,38 @@ +import logging +import typing + +LogHook = typing.Callable[[str], None] + + +class HookableInMemoryHandler(logging.Handler): + """Hookable in-memory logging handler for logs window""" + + _log: str + _hook: typing.Optional[typing.Callable[[str], None]] + + def __init__(self, *args, **kwargs): + super(HookableInMemoryHandler, self).__init__(*args, **kwargs) + self._log = "" + self._hook = None + + @property + def log(self) -> str: + return self._log + + def emit(self, record): + msg = self.format(record) + self._log += msg + "\n" + if self._hook is not None: + self._hook(msg) + + def write(self, m): + pass + + def clearLog(self) -> None: + self._log = "" + + def setHook(self, hook: typing.Callable[[str], None]) -> None: + self._hook = hook + + def clearHook(self) -> None: + self._hook = None