Pyqt写一个日志类

功能说明

1. LogTester类:

  • 新增组件,包含五个测试按钮,分别对应五种日志级别
  • 每个按钮有不同的背景颜色,便于直观区分

2. 按钮样式:

  • DEBUG: 灰色背景
  • INFO: 黑色背景
  • WARNING: 橙色背景
  • ERROR: 红色背景
  • CRITICAL: 紫色背景

3. 按钮功能

  • 点击按钮会发送对应级别的日志消息
  • 日志消息包含调用函数名和行号

4. 界面布局

  • 测试按钮位于窗口顶部,方便快速测试
  • 保持原有功能不变,同时增加了新的测试方式

现在你可以通过点击这五个按钮来快速测试不同级别的日志功能,观察它们在日志显示区域的不同颜色和格式。
在这里插入图片描述

5.代码

import sys
import os
import time
import datetime
import inspect
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,
                             QHBoxLayout, QTextEdit, QPushButton, QLabel, QComboBox,
                             QFileDialog, QSplitter, QAction, QMenuBar,
                             QToolBar, QStatusBar, QMessageBox, QDockWidget)
from PyQt5.QtCore import Qt, pyqtSignal, QObject, QThread, QMutex, QMetaObject
from PyQt5.QtGui import QFont, QColor, QTextCursor, QTextCharFormat


class Logger(QObject):
    """
    线程安全的日志记录器,支持日志级别和GUI显示
    """
    log_message = pyqtSignal(str, int)  # 信号:日志消息,日志级别

    # 日志级别定义
    DEBUG = 0
    INFO = 1
    WARNING = 2
    ERROR = 3
    CRITICAL = 4

    # 日志级别文本和颜色
    LOG_LEVELS = {
   
   
        DEBUG: ("DEBUG", QColor(128, 128, 128)),  # 灰色
        INFO: ("INFO", QColor(0, 0, 0)),  # 黑色
        WARNING: ("WARNING", QColor(255, 128, 0)),  # 橙色
        ERROR: ("ERROR", QColor(255, 0, 0)),  # 红色
        CRITICAL: ("CRITICAL", QColor(255, 0, 255))  # 紫色
    }

    def __init__(self, parent=None):
        super().__init__(parent)
        self.log_file = None
        self.log_level = self.INFO
        self.mutex = QMutex()  # 用于线程安全
        self.max_log_size = 10 * 1024 * 1024  # 10MB
        self.log_to_file = False
        self.show_caller_info = True  # 是否显示调用者信息

    def set_log_file(self, file_path):
        """设置日志文件路径"""
        self.log_file = file_path
        self.log_to_file = True
        self._rotate_log_file()

    def set_log_level(self, level):
        """设置日志级别"""
        self.log_level = level

    def set_show_caller_info(self, show=True):
        """设置是否显示调用者信息"""
        self.show_caller_info = show

    def debug(self, message):
        """记录调试级别的日志"""
        self._log(self.DEBUG, message)

    def info(self, message):
        """记录信息级别的日志"""
        self._log(self.INFO, message)

    def warning(self, message):
        """记录警告级别的日志"""
        self._log(self.WARNING, message)

    def error(self, message):
        """记录错误级别的日志"""
        self._log(self.ERROR, message)

    def critical(self, message):
        """记录严重错误级别的日志"""
        self._log(self.CRITICAL, message)

    def _get_caller_info(self):
        """获取调用者信息(函数名和行号)"""
        try:
            # 从栈中获取调用者信息
            # 0: _get_caller_info, 1: _log, 2: debug/info/warning/error/critical, 3: 实际调用位置
            frame = inspect.currentframe().f_back.f_back.f_back
            function_name = frame.f_code.co_name
            file_name = os.path.basename(frame.f_code.co_filename)
            line_number = frame.f_lineno
            return f"{
     
     file_name}:{
     
     function_name}():{
     
     line_number}"
        except Exception as e:
            return "unknown:unknown():0"

    def _log(self, level, message):
        """内部日志记录方法"""
        if level < self.log_level:
            return

        # 获取当前时间
        timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值