Skip to content

qt 记录-日志记录方式

这是我的一个项目中的 main.py,主要有以下几点:

1. 解析 BASE_DIR 中判断是正常脚本,还是 Pyinstaller 编译的程序,这样可以把日志放在正确的位置
2. 设置 sys.exception 为一个自定义的函数,这样异常退出时可以统一进入这个函数,里面使用 traceback 进行详细输出
3. 上面的自定义异常处理函数,最后显示 QMessageBox,这样比较用户友好一些
4. 进行了输出重定向,这一点不算很推荐。主要因为里面的各个类用了许多 print,所以我懒得每次都要写入文件,所以就用了重定向
5. 如果不用输出重定向,异常处理中使用 traceback 的地方可能要稍微修改一些,写入对应的文件,具体自行查阅资料

import os
os.chdir(os.path.dirname(__file__))

import sys
from PyQt5.QtWidgets import QApplication, QMessageBox
from PyQt5.QtCore import Qt, QTimer
import time
import traceback

# 正常运行 .py 文件时
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
if getattr(sys, 'frozen', False):
    # 被 PyInstaller 等工具打包后的执行路径
    BASE_DIR = os.path.dirname(sys.executable)

# 定义日志文件路径
log_file = os.path.join(BASE_DIR, 'LOG.txt')

def show_error_dialog_in_main_thread():
    msg_box = QMessageBox()
    msg_box.setWindowFlags(msg_box.windowFlags() | Qt.WindowStaysOnTopHint)
    msg_box.setIcon(QMessageBox.Critical)
    msg_box.setWindowTitle("未处理的错误")
    msg_box.setText(f'发生错误,请检查 {os.path.dirname(__file__)} 中的 LOG.txt 文件')
    msg_box.exec_()

    # 错误框关闭后退出
    sys.exit(1)

def global_exception_handler(exctype, value, tb):
    # 写入日志
    # 打印时间
    print(f'{time.strftime("%Y-%m-%d %H:%M:%S")}\n')
    # 打印错误信息
    traceback.print_exception(exctype, value, tb, file=sys.stdout)

    show_error_dialog_in_main_thread()


# 在程序启动时设置
sys.excepthook = global_exception_handler

# 重定向标准输出
sys.stdout = open(log_file, 'w', encoding='utf-8')

app = QApplication(sys.argv)
from captureWin import CaptureWin
mainwin = CaptureWin(BASE_DIR)
mainwin.show()
sys.exit(app.exec_())

Comments