MenuBase/utils/logging_manager.py

69 lines
2.3 KiB
Python

# utils/logging_manager.py
"""
Logging manager with GUI integration
"""
import logging
import os
from typing import Optional
from datetime import datetime
from pathlib import Path
import tkinter as tk
from tkinter import ttk
from queue import Queue, Empty
import threading
from .output_redirector import OutputRedirector
class LoggingManager:
def __init__(self, work_dir: str):
self.work_dir = work_dir
self.log_dir = os.path.join(work_dir, "logs")
os.makedirs(self.log_dir, exist_ok=True)
self.logger = self._setup_logger()
self.queue: Optional[Queue] = None
self.text_widget: Optional[tk.Text] = None
def _setup_logger(self) -> logging.Logger:
logger = logging.getLogger("app_logger")
logger.setLevel(logging.INFO)
# File handler
log_file = os.path.join(self.log_dir, f"app_{datetime.now():%Y%m%d}.log")
file_handler = logging.FileHandler(log_file, encoding="utf-8")
file_handler.setLevel(logging.INFO)
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
return logger
def setup_gui_logging(self, text_widget: tk.Text, queue: Queue):
"""Setup logging to GUI text widget"""
self.text_widget = text_widget
self.queue = queue
# Add handler for GUI logging
gui_handler = logging.StreamHandler(OutputRedirector(queue))
gui_handler.setLevel(logging.INFO)
formatter = logging.Formatter("%(message)s")
gui_handler.setFormatter(formatter)
self.logger.addHandler(gui_handler)
def process_log_queue(self):
"""Process pending log messages"""
if self.queue and self.text_widget:
while True:
try:
message = self.queue.get_nowait()
self.text_widget.insert(tk.END, message)
self.text_widget.see(tk.END)
self.text_widget.update_idletasks()
except Empty:
break
def clear_output(self):
"""Clear the text widget"""
if self.text_widget:
self.text_widget.delete("1.0", tk.END)