''' Set up the logging @author: olivier.massot, 2018 ''' import logging.config import sys import traceback import yaml from MnCheck.core.constants import LOGDIR, LOGCONF from qgis.core import QgsMessageLog #@UnresolvedImport _to_qgis_level = {logging.DEBUG: 0, logging.INFO: 0, logging.WARNING: 1, logging.ERROR: 2, logging.CRITICAL: 2, logging.NOTSET: 4} class QgsLogHandler(logging.Handler): _qgs_iface = None @classmethod def connect_to_iface(cls, iface): cls._qgs_iface = iface def emit(self, record): try: msg = self.format(record) level = record.levelno QgsMessageLog.logMessage(msg, "MnCheck", _to_qgis_level[level]) if self._qgs_iface and record.levelno >= logging.WARNING: self._qgs_iface.messageBar().pushMessage("MnCheck", msg, level=_to_qgis_level[level]) except (KeyboardInterrupt, SystemExit): raise except: self.handleError(record) def write(self, msg): QgsMessageLog.logMessage(msg, "MnCheck", 0) SYS_EXCEPT_HOOK = sys.excepthook def start(name="main", level=0, filename=""): # charge la configuration du logging depuis le fichier 'logging.yaml' with open(LOGCONF, 'rt') as f: conf = yaml.load(f) if level: conf["loggers"][name]["level"] = level if not filename: filename = LOGDIR / r'{}.log'.format(name) conf["handlers"]["file"]["filename"] = filename logging.config.dictConfig(conf) logger = logging.getLogger(name) def _excepthook(typ, value, trace): """ Remplace la gestion d'erreur standard, pour logger aussi les erreurs non gérées """ logger.error("{}\n{}\n{}".format(typ.__name__, value, ''.join(traceback.format_tb(trace)))) SYS_EXCEPT_HOOK(typ, value, trace) sys.excepthook = _excepthook