Refactor Windows installer configuration and improve logging functionality

- Changed installation scope from "perMachine" to "perUser" in the Windows installer configuration.
- Updated installation directory from "ProgramFiles64Folder" to "LocalAppDataFolder" for user-specific installations.
- Enhanced the configuration saving method to create parent directories if they don't exist.
- Improved the main window script loading logic to support multiple installation scenarios (development, PyInstaller, MSI).
- Added detailed logging for script loading failures and success messages.
- Implemented a new method to reconfigure logging settings at runtime, allowing dynamic updates from the settings dialog.
- Enhanced the settings dialog to handle configuration saving, including log level changes and error handling.
This commit is contained in:
claudi 2026-02-19 15:48:59 +01:00
parent 0c276b9022
commit 8f3f859e5b
9 changed files with 3068 additions and 2905 deletions

View file

@ -154,6 +154,66 @@ def setup_logging(
return logger
def reconfigure_logging(
logger_name: str = "webdrop_bridge",
level: str = "INFO",
log_file: Optional[Path] = None,
) -> None:
"""Reconfigure existing logger at runtime (e.g., from settings dialog).
Updates the log level and log file for a running logger.
Useful when user changes logging settings in the UI.
Args:
logger_name: Name of logger to reconfigure
level: New logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
log_file: Optional path to log file
Raises:
KeyError: If level is not a valid logging level
"""
try:
numeric_level = getattr(logging, level.upper())
except AttributeError as e:
raise KeyError(f"Invalid logging level: {level}") from e
logger = logging.getLogger(logger_name)
logger.setLevel(numeric_level)
# Update level on all existing handlers
for handler in logger.handlers:
handler.setLevel(numeric_level)
# If log file changed, remove old file handler and add new one
if log_file:
# Remove old file handlers
for handler in logger.handlers[:]:
if isinstance(handler, logging.handlers.RotatingFileHandler):
handler.close()
logger.removeHandler(handler)
try:
# Create parent directories if needed
log_file.parent.mkdir(parents=True, exist_ok=True)
# Create new file handler
file_handler = logging.handlers.RotatingFileHandler(
log_file,
maxBytes=10 * 1024 * 1024, # 10 MB
backupCount=5,
encoding="utf-8",
)
file_handler.setLevel(numeric_level)
# Use same formatter as existing handlers
if logger.handlers:
file_handler.setFormatter(logger.handlers[0].formatter)
logger.addHandler(file_handler)
except (OSError, IOError) as e:
raise ValueError(f"Cannot write to log file {log_file}: {e}") from e
def get_logger(name: str = __name__) -> logging.Logger:
"""Get a logger instance for a module.