1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
# -*- coding: utf-8 -*-
# loggerwindow.py
# Copyright (C) 2013 LEAP
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
History log window
"""
import logging
from PySide import QtGui
from ui_loggerwindow import Ui_LoggerWindow
from leap.common.check import leap_assert, leap_assert_type
from leap.util.leap_log_handler import LeapLogHandler
logger = logging.getLogger(__name__)
class LoggerWindow(QtGui.QWidget):
"""
Window that displays a history of the logged messages in the app.
"""
def __init__(self, handler):
"""
Initialize the widget with the custom handler.
:param handler: Custom handler that supports history and signal.
:type handler: LeapLogHandler.
"""
QtGui.QWidget.__init__(self)
leap_assert(handler, "We need a handler for the logger window")
leap_assert_type(handler, LeapLogHandler)
# Load UI
self.ui = Ui_LoggerWindow()
self.ui.setupUi(self)
# Make connections
self.ui.btnSave.clicked.connect(self._save_log_to_file)
self.ui.btnDebug.toggled.connect(self._load_history),
self.ui.btnInfo.toggled.connect(self._load_history),
self.ui.btnWarning.toggled.connect(self._load_history),
self.ui.btnError.toggled.connect(self._load_history),
self.ui.btnCritical.toggled.connect(self._load_history)
# Load logging history and connect logger with the widget
self._logging_handler = handler
self._connect_to_handler()
self._load_history()
def _connect_to_handler(self):
"""
This method connects the loggerwindow with the handler through a
signal communicate the logger events.
"""
self._logging_handler.new_log.connect(self._add_log_line)
def _add_log_line(self, log):
"""
Adds a line to the history, only if it's in the desired levels to show.
:param log: a log record to be inserted in the widget
:type log: a dict with RECORD_KEY and MESSAGE_KEY.
the record contains the LogRecord of the logging module,
the message contains the formatted message for the log.
"""
level = log[LeapLogHandler.RECORD_KEY].levelname
message = log[LeapLogHandler.MESSAGE_KEY]
if self._logs_to_display[level]:
self.ui.txtLogHistory.append(message)
def _load_history(self):
"""
Load the previous logged messages in the widget.
They are stored in the custom handler.
"""
self._set_logs_to_display()
self.ui.txtLogHistory.clear()
history = self._logging_handler.log_history
for line in history:
self._add_log_line(line)
def _set_logs_to_display(self):
"""
Sets the logs_to_display dict getting the toggled options from the ui
"""
self._logs_to_display = {
'DEBUG': self.ui.btnDebug.isChecked(),
'INFO': self.ui.btnInfo.isChecked(),
'WARNING': self.ui.btnWarning.isChecked(),
'ERROR': self.ui.btnError.isChecked(),
'CRITICAL': self.ui.btnCritical.isChecked()
}
def _save_log_to_file(self):
"""
Lets the user save the current log to a file
"""
fileName, filtr = QtGui.QFileDialog.getSaveFileName(
self, self.tr("Save As"))
if fileName:
try:
with open(fileName, 'w') as output:
output.write(self.ui.txtLogHistory.toPlainText())
output.write('\n')
logger.debug('Log saved in %s' % (fileName, ))
except IOError, e:
logger.error("Error saving log file: %r" % (e, ))
else:
logger.debug('Log not saved!')
|