logging_.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 MnCheck.core.constants import LOGDIR, LOGCONF
  10. from qgis.core import QgsMessageLog #@UnresolvedImport
  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. def write(self, msg):
  34. QgsMessageLog.logMessage(msg, "MnCheck", 0)
  35. SYS_EXCEPT_HOOK = sys.excepthook
  36. def start(name="main", level=0, filename=""):
  37. # charge la configuration du logging depuis le fichier 'logging.yaml'
  38. with open(LOGCONF, 'rt') as f:
  39. conf = yaml.load(f)
  40. if level:
  41. conf["loggers"][name]["level"] = level
  42. if not filename:
  43. filename = LOGDIR / r'{}.log'.format(name)
  44. conf["handlers"]["file"]["filename"] = filename
  45. logging.config.dictConfig(conf)
  46. logger = logging.getLogger(name)
  47. def _excepthook(typ, value, trace):
  48. """ Remplace la gestion d'erreur standard, pour logger aussi les erreurs non gérées """
  49. logger.error("{}\n{}\n{}".format(typ.__name__, value, ''.join(traceback.format_tb(trace))))
  50. SYS_EXCEPT_HOOK(typ, value, trace)
  51. sys.excepthook = _excepthook