logging_.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. '''
  2. Set up the logging
  3. @author: olivier.massot, 2018
  4. '''
  5. import logging.config
  6. import sys
  7. import traceback
  8. import yaml
  9. from core.constants import LOGDIR, LOGCONF
  10. from qgis.core import QgsMessageLog
  11. _to_qgis_level = {logging.DEBUG: 0,
  12. logging.INFO: 0,
  13. logging.WARNING: 1,
  14. logging.ERROR: 2,
  15. logging.CRITICAL: 2,
  16. logging.NOTSET: 4}
  17. class QgsLogHandler(logging.Handler):
  18. _qgs_iface = None
  19. @classmethod
  20. def connect_to_iface(cls, iface):
  21. cls._qgs_iface = iface
  22. def emit(self, record):
  23. try:
  24. msg = self.format(record)
  25. level = record.levelno
  26. QgsMessageLog.logMessage(msg, "MnCheck", _to_qgis_level[level])
  27. if self._qgs_iface and record.levelno >= logging.WARNING:
  28. self._qgs_iface.messageBar().pushMessage("MnCheck", msg, level=_to_qgis_level[level])
  29. except (KeyboardInterrupt, SystemExit):
  30. raise
  31. except:
  32. self.handleError(record)
  33. SYS_EXCEPT_HOOK = sys.excepthook
  34. def start(name="main", level=0, filename=""):
  35. # charge la configuration du logging depuis le fichier 'logging.yaml'
  36. with open(LOGCONF, 'rt') as f:
  37. conf = yaml.load(f)
  38. if level:
  39. conf["loggers"][name]["level"] = level
  40. if not filename:
  41. filename = LOGDIR / r'{}.log'.format(name)
  42. conf["handlers"]["file"]["filename"] = filename
  43. logging.config.dictConfig(conf)
  44. logger = logging.getLogger(name)
  45. def _excepthook(typ, value, trace):
  46. """ Remplace la gestion d'erreur standard, pour logger aussi les erreurs non gérées """
  47. logger.error("{}\n{}\n{}".format(typ.__name__, value, ''.join(traceback.format_tb(trace))))
  48. SYS_EXCEPT_HOOK(typ, value, trace)
  49. sys.excepthook = _excepthook