feat: 改进日志系统和文档

1. 改进日志系统
- 添加日志文件轮转功能
- 优化日志文件路径处理
- 重定向控制台输出
- 添加错误处理机制

2. 更新文档
- 添加日志系统说明
- 更新最近更新记录
This commit is contained in:
zhukang 2025-01-15 23:47:15 +08:00
parent bb5e014a9b
commit b19f1d1d11
2 changed files with 109 additions and 8 deletions

View File

@ -164,6 +164,25 @@ save_location/
- 包含配置文件和分类规则文件 - 包含配置文件和分类规则文件
- 支持的 Python 版本3.10+ - 支持的 Python 版本3.10+
## 📝 日志说明
应用程序运行时的所有日志都保存在 `logs` 目录下:
- 日志文件:`llmclipboard.log`
- 日志级别INFO 及以上
- 日志轮转:单个文件最大 5MB保留 3 个备份文件
- 日志内容:包含所有控制台输出和错误信息
### 日志文件位置
- 开发环境:项目根目录下的 `logs` 文件夹
- 打包环境:可执行文件所在目录的 `logs` 文件夹
### 日志内容说明
- 应用程序启动和关闭信息
- 剪贴板操作记录
- 文件保存操作记录
- 错误和异常信息
- 调试信息DEBUG 级别,默认不记录)
## 🔄 最近更新 ## 🔄 最近更新
### 2025-01-15 ### 2025-01-15
@ -181,6 +200,23 @@ save_location/
- 确保 UTF-8 编码支持 - 确保 UTF-8 编码支持
- 优化日志格式和可读性 - 优化日志格式和可读性
### 2025-01-16
- 添加应用程序打包支持
- 使用 PyInstaller 打包为独立可执行文件
- 添加打包配置文件 `llmclipboard.spec`
- 优化打包后的文件结构和依赖管理
- 改进日志系统
- 添加日志文件轮转功能,单个文件最大 5MB
- 优化日志文件路径处理,支持开发和打包环境
- 重定向控制台输出到日志文件
- 添加错误处理和临时日志备份机制
- 文档更新
- 添加打包说明和配置文档
- 补充日志系统使用说明
- 更新项目结构说明
## 🤝 贡献指南 ## 🤝 贡献指南
1. Fork 项目 1. Fork 项目

View File

@ -9,9 +9,24 @@ import keyboard
import threading import threading
import sys import sys
import logging import logging
from logging.handlers import RotatingFileHandler
from PyQt6.QtWidgets import QApplication from PyQt6.QtWidgets import QApplication
from .gui import MainWindow from llmclipboard.gui import MainWindow
from .document_processor import DocumentProcessor from llmclipboard.document_processor import DocumentProcessor
# 重定向标准输出和标准错误到日志
class StreamToLogger:
def __init__(self, logger, level):
self.logger = logger
self.level = level
self.linebuf = ''
def write(self, buf):
for line in buf.rstrip().splitlines():
self.logger.log(self.level, line.rstrip())
def flush(self):
pass
class TextCaptureService: class TextCaptureService:
def __init__(self): def __init__(self):
@ -33,13 +48,63 @@ class TextCaptureService:
fallback=os.path.expanduser('~/Documents')) fallback=os.path.expanduser('~/Documents'))
def setup_logging(self): def setup_logging(self):
logging.basicConfig( try:
filename='text_capture.log', # 获取应用程序根目录
level=logging.INFO, if getattr(sys, 'frozen', False):
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' # 如果是打包后的环境
app_root = os.path.dirname(sys.executable)
else:
# 如果是开发环境
app_root = os.path.dirname(os.path.dirname(__file__))
# 设置日志目录
log_dir = os.path.join(app_root, 'logs')
if not os.path.exists(log_dir):
os.makedirs(log_dir)
# 设置日志文件路径
log_file = os.path.join(log_dir, 'llmclipboard.log')
# 创建 RotatingFileHandler
file_handler = RotatingFileHandler(
log_file,
maxBytes=5*1024*1024, # 5MB
backupCount=3,
encoding='utf-8'
) )
# 设置日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
# 配置根日志记录器
root_logger = logging.getLogger()
root_logger.setLevel(logging.INFO)
# 移除所有现有的处理器
for handler in root_logger.handlers[:]:
root_logger.removeHandler(handler)
# 添加新的处理器
root_logger.addHandler(file_handler)
# 创建应用程序日志记录器
self.logger = logging.getLogger(__name__) self.logger = logging.getLogger(__name__)
# 重定向标准输出和标准错误到日志
sys.stdout = StreamToLogger(self.logger, logging.INFO)
sys.stderr = StreamToLogger(self.logger, logging.ERROR)
self.logger.info('日志系统初始化完成')
self.logger.info(f'日志文件路径: {log_file}')
except Exception as e:
# 如果日志设置失败,尝试写入到临时目录
import tempfile
temp_dir = tempfile.gettempdir()
fallback_log = os.path.join(temp_dir, 'llmclipboard_error.log')
with open(fallback_log, 'a', encoding='utf-8') as f:
f.write(f'{time.strftime("%Y-%m-%d %H:%M:%S")} - 日志初始化失败: {str(e)}\n')
def is_valid_content(self, content): def is_valid_content(self, content):
"""验证内容是否有效""" """验证内容是否有效"""
if not content: if not content: