log, logview: use levels instead of prefixes and colorize log view output

This commit is contained in:
Laurent Monin
2013-07-04 20:57:49 +02:00
parent b55976002d
commit ea2a95eec4
2 changed files with 47 additions and 18 deletions

View File

@@ -24,6 +24,11 @@ from PyQt4 import QtCore
from picard.util import thread
LOG_INFO = 1
LOG_WARNING = 2
LOG_ERROR = 4
LOG_DEBUG = 8
_entries = deque(maxlen=50000)
_receivers = []
_log_debug_messages = False
@@ -37,22 +42,19 @@ def unregister_receiver(receiver):
_receivers.remove(receiver)
def _message(prefix, message, args, kwargs):
def _message(level, message, args, kwargs):
if not (isinstance(message, str) or isinstance(message, unicode)):
message = repr(message)
if args:
message = message % args
prefix = "%s" % (prefix,)
time = str(QtCore.QTime.currentTime().toString())
message = "%s" % (message,)
if isinstance(prefix, unicode):
prefix = prefix.encode("utf-8", "replace")
if isinstance(message, unicode):
message = message.encode("utf-8", "replace")
_entries.append((prefix, time, message))
_entries.append((level, time, message))
for func in _receivers:
try:
func(prefix, time, message)
func(level, time, message)
except Exception, e:
import traceback
traceback.print_exc()
@@ -60,23 +62,33 @@ def _message(prefix, message, args, kwargs):
def debug(message, *args, **kwargs):
if _log_debug_messages:
thread.proxy_to_main(_message, "D:", message, args, kwargs)
thread.proxy_to_main(_message, LOG_DEBUG, message, args, kwargs)
def info(message, *args, **kwargs):
thread.proxy_to_main(_message, "I:", message, args, kwargs)
thread.proxy_to_main(_message, LOG_INFO, message, args, kwargs)
def warning(message, *args, **kwargs):
thread.proxy_to_main(_message, "W:", message, args, kwargs)
thread.proxy_to_main(_message, LOG_WARNING, message, args, kwargs)
def error(message, *args, **kwargs):
thread.proxy_to_main(_message, "E:", message, args, kwargs)
thread.proxy_to_main(_message, LOG_ERROR, message, args, kwargs)
def _stderr_receiver(prefix, time, msg):
sys.stderr.write("%s %s %s %s%s" % (prefix, str(QtCore.QThread.currentThreadId()), time, msg, os.linesep))
_log_prefixes = {
LOG_INFO: 'I:',
LOG_WARNING: 'W:',
LOG_ERROR: 'E:',
LOG_DEBUG: 'D:',
}
def _stderr_receiver(level, time, msg):
sys.stderr.write("%s %s %s %s%s" % (_log_prefixes[level],
str(QtCore.QThread.currentThreadId()),
time, msg, os.linesep))
register_receiver(_stderr_receiver)

View File

@@ -26,25 +26,42 @@ class LogView(QtGui.QDialog):
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.resize(540, 340)
self.resize(740, 340)
self.setWindowTitle(_("Log"))
self.doc = QtGui.QTextDocument(self)
self.textCursor = QtGui.QTextCursor(self.doc)
font = QtGui.QFont()
font.setFamily("Monospace")
self.textFormat = QtGui.QTextCharFormat()
self.textFormat.setFont(font)
self.textFormatInfo = QtGui.QTextCharFormat()
self.textFormatInfo.setFont(font)
self.textFormatInfo.setForeground(QtGui.QColor('black'))
self.textFormatDebug = QtGui.QTextCharFormat()
self.textFormatDebug.setFont(font)
self.textFormatDebug.setForeground(QtGui.QColor('purple'))
self.textFormatWarning = QtGui.QTextCharFormat()
self.textFormatWarning.setFont(font)
self.textFormatWarning.setForeground(QtGui.QColor('darkorange'))
self.textFormatError = QtGui.QTextCharFormat()
self.textFormatError.setFont(font)
self.textFormatError.setForeground(QtGui.QColor('red'))
self.formats = {
log.LOG_INFO: self.textFormatInfo,
log.LOG_WARNING: self.textFormatWarning,
log.LOG_ERROR: self.textFormatError,
log.LOG_DEBUG: self.textFormatDebug,
}
self.browser = QtGui.QTextBrowser(self)
self.browser.setDocument(self.doc)
vbox = QtGui.QHBoxLayout(self)
vbox.addWidget(self.browser)
for level, time, msg in log._entries:
self.add_entry(prefix, time, msg)
self.add_entry(level, time, msg)
log.register_receiver(self.add_entry)
def add_entry(self, prefix, time, msg):
def add_entry(self, level, time, msg):
self.textCursor.movePosition(QtGui.QTextCursor.End)
self.textCursor.insertText(prefix + ' ' + str(QtCore.QThread.currentThreadId()) + ' ' + time + ' ' + msg, self.textFormat)
self.textCursor.insertText(time + ' ' + msg, self.formats[level])
self.textCursor.insertBlock()
sb = self.browser.verticalScrollBar()
sb.setValue(sb.maximum())