From 7e72b0dab978c7b709e8c6b80f8805d8c1a5db25 Mon Sep 17 00:00:00 2001 From: Pataesci Bufran <56449288+JasonLeung1983@users.noreply.github.com> Date: Thu, 27 Nov 2025 03:08:17 +0300 Subject: [PATCH] Refactor logger setup with optional name and level Refactor setup_logger to accept name and level parameters, ensuring a StreamHandler is added only once and directing logs to sys.stderr. --- settings/logger.py | 54 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/settings/logger.py b/settings/logger.py index db6d97e..62235d7 100644 --- a/settings/logger.py +++ b/settings/logger.py @@ -1,13 +1,51 @@ import logging import sys +from typing import Optional -def setup_logger(): - logger = logging.getLogger() - logger.setLevel(logging.INFO) +def setup_logger(name: Optional[str] = None, level: int = logging.INFO) -> logging.Logger: + """ + Sets up a basic logger for the application or a specific module. - handler = logging.StreamHandler(sys.stdout) - handler.setLevel(logging.INFO) - formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") - handler.setFormatter(formatter) - logger.addHandler(handler) + This function ensures that a StreamHandler is only added once and directs + log output to sys.stderr for better separation from normal program output. + + Args: + name: The name of the logger to configure (e.g., 'app.module'). + If None, configures the root logger. + level: The minimum logging level to output. + + Returns: + The configured logging.Logger instance. + """ + # 1. Get the logger instance. + logger = logging.getLogger(name) + logger.setLevel(level) + + # 2. Check if a StreamHandler is already present to prevent duplicate logs. + if not logger.handlers: + # Create a StreamHandler that directs logs to standard error. + handler = logging.StreamHandler(sys.stderr) + handler.setLevel(level) + + # Define a consistent format for log messages. + formatter = logging.Formatter( + "%(asctime)s - %(name)s - %(levelname)s - %(message)s" + ) + handler.setFormatter(formatter) + + # Add the handler to the logger. + logger.addHandler(handler) + + return logger + +# Example Usage (Not part of the optimized function, for illustration only): +if __name__ == "__main__": + # Configure the root logger + root_log = setup_logger() + root_log.info("This is an INFO message from the root logger.") + + # Configure a specific module logger + module_log = setup_logger("database_module", logging.DEBUG) + module_log.debug("This is a DEBUG message from the module logger.") + module_log.error("This is an ERROR message from the module logger.")