123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- import logging
- from PyQt5.QtWidgets import QPlainTextEdit, QGroupBox, QVBoxLayout
- from ..python_core.appdirs import get_app_log_dir
- import pathlib as pl
- import time
- import sys
- # solution copied from https://stackoverflow.com/questions/28655198/best-way-to-display-logs-in-pyqt
- class QPlainTextEditLogger(QPlainTextEdit, logging.Handler):
- def __init__(self, parent):
- super(QPlainTextEdit, self).__init__(parent)
- super(logging.Handler, self).__init__()
- self.setReadOnly(True)
- def emit(self, record):
- msg = self.format(record)
- text_cursor = self.textCursor()
- text_cursor.insertText(f"{msg}\n")
- self.setTextCursor(text_cursor)
- class LoggerGroupBox(QGroupBox):
- def __init__(self, parent, location_dir=None):
- super().__init__("Event Log", parent)
- if location_dir is None:
- location_dir = get_app_log_dir()
- log_dir = pl.Path(location_dir)
- log_dir.mkdir(exist_ok=True, parents=True)
- log_file = str(log_dir / f"started_at_{time.strftime('%Y-%m-%d-%H-%M-%S')}.log")
- vbox = QVBoxLayout(self)
- self.log_pte = QPlainTextEditLogger(parent)
- self.log_pte.setLevel(level=logging.INFO)
- vbox.addWidget(self.log_pte)
- view_logger = logging.getLogger("VIEW")
- view_logger.setLevel(level=logging.INFO)
- formatter = logging.Formatter("%(asctime)s [VIEW] [%(levelname)-5.5s] %(message)s")
- self.log_file_handler = logging.FileHandler(log_file)
- self.log_file_handler.setFormatter(formatter)
- self.log_file_handler.setLevel(level=logging.DEBUG)
- view_logger.addHandler(self.log_file_handler)
- self.log_pte.setFormatter(formatter)
- view_logger.addHandler(self.log_pte)
- stream_handler = logging.StreamHandler(sys.stdout)
- stream_handler.setLevel(level=logging.INFO)
- stream_handler.setFormatter(formatter)
- view_logger.addHandler(stream_handler)
- def __del__(self):
- root_logger = logging.getLogger("VIEW")
- root_logger.removeHandler(self.log_pte)
- root_logger.removeHandler(self.log_file_handler)
|