功能说明
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"

最低0.47元/天 解锁文章
5621

被折叠的 条评论
为什么被折叠?



