Модуль logging. Трассировка не записывается в log
Использую модуль logging для записи отладочной информации в лог-файл.
Создаю ошибку в строке 26.
from sys import argv, exit
import logging
from PyQt5.QtWidgets import QApplication, QMainWindow
class Window(QMainWindow):
def __init__(self):
super(Window, self).__init__()
def InitWindow(self):
self.setGeometry(0, 0, 400, 300)
self.setMouseTracking(True)
def mousePressEvent(self, a0):
#a = 5 / 0
pass
if __name__ == '__main__':
log_format = '%(asctime)s %(filename)s: %(message)s'
logging.basicConfig(filename="tst_logfile.log", format=log_format,
datefmt='%Y-%m-%d %H:%M:%S', level='DEBUG')
try:
app = QApplication(argv)
window = Window()
window.show()
# create an error
a = 5 / 0
except Exception as e:
logging.debug(e, exc_info=True)
exit(app.exec_())
Всё работает отлично, лог записывается.
Причем приложение продолжает работать (а должно вылетать).
2022-05-28 17:32:27 tst.py: division by zero
Traceback (most recent call last):
File "C:\Users\Tom\PycharmProjects\pythonProject2\tst.py", line 26, in <module>
a = 5 / 0
ZeroDivisionError: division by zero
Но стоит перенести ошибку в событие mousePressEvent (строка 14), трассировка в файл не записывается. Хотя ошибка возникает и приложение прекращает работу.
from sys import argv, exit
import logging
from PyQt5.QtWidgets import QApplication, QMainWindow
class Window(QMainWindow):
def __init__(self):
super(Window, self).__init__()
def InitWindow(self):
self.setGeometry(0, 0, 400, 300)
self.setMouseTracking(True)
def mousePressEvent(self, a0):
a = 5 / 0
#pass
if __name__ == '__main__':
log_format = '%(asctime)s %(filename)s: %(message)s'
logging.basicConfig(filename="tst_logfile.log", format=log_format,
datefmt='%Y-%m-%d %H:%M:%S', level='DEBUG')
try:
app = QApplication(argv)
window = Window()
window.show()
# create an error
#a = 5 / 0
except Exception as e:
logging.debug(e, exc_info=True)
exit(app.exec_())
Что я делаю неправильно?
Как сделать, чтобы все ошибки приложения записывались в лог?
Ответы (1 шт):
Всё работает отлично, лог записывается. Причем приложение продолжает работать (а должно вылетать).
Нет, не должно вылетать,
так как вы обернули ошибку в try - except.
Но стоит перенести ошибку в событие
mousePressEvent, трассировка в файл не записывается. Хотя ошибка возникает и приложение прекращает работу.
traceback — Print or retrieve a stack traceback, вам в помощь.
import sys
import logging
import traceback # !!! +++
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class Window(QMainWindow):
def __init__(self):
super(Window, self).__init__()
self.resize(400, 300)
self.centralwidget = QtWidgets.QWidget()
self.setCentralWidget(self.centralwidget)
name = 'Павел'
self.label = QtWidgets.QLabel(f'<h1>Привет, {name}!</h1>', alignment=Qt.AlignCenter)
self.label.setStyleSheet('background-color: #D98C00;')
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
def mousePressEvent(self, event):
a = 77 // 0 # !!!
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
def except_hook(exc_type, exc_value, exc_tb):
tb = "".join(traceback.format_exception(exc_type, exc_value, exc_tb))
logging.error(f'\n Что-то пошло не так - Error: {tb}\n')
msg = QtWidgets.QMessageBox.warning(
None,
'Внимание',
f'{tb}'
)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
if __name__ == '__main__':
log_format = '%(asctime)s %(filename)s: %(message)s'
logging.basicConfig(filename="tst_logfile.log", format=log_format,
datefmt='%Y-%m-%d %H:%M:%S', level='DEBUG')
# +++
sys.excepthook = except_hook # +++
try:
app = QApplication(sys.argv)
window = Window()
window.show()
# create an error
a = 5 / 0
except Exception as e:
logging.debug(e, exc_info=True)
logging.error(f'\nЧто-то пошло не так - Error: {e}\n')
msg = QtWidgets.QMessageBox.warning(
None,
'Внимание',
f'Что-то пошло не так - Error: \n{e}'
)
sys.exit(app.exec_())

