69 lines
2.3 KiB
Python
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) |