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:
parent
0c276b9022
commit
8f3f859e5b
9 changed files with 3068 additions and 2905 deletions
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue