File size: 1,357 Bytes
b62e029
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# core/logger.py

import logging
import sys
from typing import Optional

try:
    from core.config import settings
    DEFAULT_LOG_LEVEL = settings.LOG_LEVEL
except ImportError:
    DEFAULT_LOG_LEVEL = "INFO"

# logging format: timestamp | log level | logger name | message
LOG_FORMAT = "%(asctime)s | %(levelname)-8s | %(name)s | %(message)s"
DATE_FORMAT = "%Y-%m-%d %H:%M:%S"

def setup_logger(name: str, level: Optional[str] = None) -> logging.Logger:
    """
    Returns a standardized logger instance for use in each module.  
    Usage: logger = setup_logger(__name__)
    """
    logger = logging.getLogger(name)
    
    # If the logger already has a handler set up (to prevent duplicate calls), return as is.
    if logger.handlers:
        return logger

    # Set the log level
    log_level = level or DEFAULT_LOG_LEVEL
    logger.setLevel(getattr(logging, log_level.upper(), logging.INFO))
    
    # Prevent duplicate logging (do not propagate to parent loggers)
    logger.propagate = False

    # Create console handler and set level
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.setLevel(logger.level)
    
    # Apply formatter
    formatter = logging.Formatter(fmt=LOG_FORMAT, datefmt=DATE_FORMAT)
    console_handler.setFormatter(formatter)
    
    logger.addHandler(console_handler)
    
    return logger