loghandler.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import logging
  2. from PyQt4 import QtGui, QtCore
  3. """
  4. This intends to be a QThread save logging handler with syntax highlighting
  5. """
  6. class LogHandler(logging.Handler):
  7. """
  8. Handler Class to configure Logging
  9. This also enables logging to the output field in the gui
  10. """
  11. def __init__(self, log_area):
  12. logging.Handler.__init__(self)
  13. self.text_area = log_area
  14. self.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s: %(message)s'))
  15. self._normal_weight = self.text_area.fontWeight()
  16. self._bold = 100
  17. def emit(self, record):
  18. self.acquire()
  19. self.text_area.append_signal.emit(record)
  20. self.release()
  21. class Highlighter(QtGui.QSyntaxHighlighter):
  22. def __init__(self, parent, theme):
  23. super(Highlighter, self).__init__(parent, )
  24. self.parent = parent
  25. self.highlightingRules = []
  26. timestamp = QtGui.QTextCharFormat()
  27. timestamp.setForeground(QtCore.Qt.blue)
  28. timestamp.setFontWeight(QtGui.QFont.Bold)
  29. self.timestamp_pattern = QtCore.QRegExp(r"^.{23}")
  30. self.timestamp_pattern.setMinimal(True)
  31. self.highlightingRules.append((self.timestamp_pattern, timestamp))
  32. loglevel = QtGui.QTextCharFormat()
  33. loglevel.setForeground(QtCore.Qt.black)
  34. loglevel.setFontWeight(QtGui.QFont.Bold)
  35. self.loglevel_pattern = QtCore.QRegExp(r":[A-Z\_]{3,13}:")
  36. self.loglevel_pattern.setMinimal(True)
  37. self.highlightingRules.append((self.loglevel_pattern, loglevel))
  38. success = QtGui.QTextCharFormat()
  39. success.setForeground(QtGui.QColor(30, 210, 0))
  40. success.setFontWeight(QtGui.QFont.Bold)
  41. pattern = QtCore.QRegExp(r".*(S|s)uccess.*")
  42. self.highlightingRules.append((pattern, success))
  43. error = QtGui.QTextCharFormat()
  44. error.setBackground(QtGui.QColor(255, 50, 50))
  45. self.error_pattern = QtCore.QRegExp("ERROR")
  46. self.error_pattern.setMinimal(True)
  47. self.highlightingRules.append((self.error_pattern, error))
  48. def setKeywords(self, kw):
  49. keyword = QtGui.QTextCharFormat()
  50. keyword.setForeground(QtCore.Qt.darkBlue)
  51. keyword.setFontWeight(QtGui.QFont.Bold)
  52. keywords = QtCore.QStringList(kw)
  53. for word in keywords:
  54. pattern = QtCore.QRegExp("\\b" + word + "\\b")
  55. self.highlightingRules.append((pattern, keyword))
  56. def highlightBlock(self, text):
  57. for pattern, format in self.highlightingRules:
  58. start = 0
  59. if pattern not in [self.timestamp_pattern, self.error_pattern, self.loglevel_pattern]:
  60. start = self.loglevel_pattern.indexIn(text)
  61. start += self.loglevel_pattern.matchedLength()
  62. index = pattern.indexIn(text, offset=start)
  63. while index >= 0:
  64. length = pattern.matchedLength()
  65. pref_format = self.format(index)
  66. pref_format.merge(format)
  67. self.setFormat(index, length, pref_format)
  68. index = text.indexOf(pattern, index + length)
  69. self.setCurrentBlockState(0)
  70. class LogArea(QtGui.QTextEdit):
  71. append_signal = QtCore.pyqtSignal(logging.LogRecord)
  72. def __init__(self):
  73. super(LogArea, self).__init__()
  74. self.highlighter = Highlighter(self, 'Classic')
  75. self.logHandler = None
  76. self.append_signal.connect(self.append)
  77. def init_logging(self):
  78. self.logHandler = LogHandler(self)
  79. logging.getLogger().addHandler(self.logHandler)
  80. def append(self, record):
  81. super(LogArea, self).append(self.logHandler.format(record))
  82. self.ensureCursorVisible()
  83. def setKeywords(self, kw):
  84. self.highlighter.setKeywords(kw)