File size: 2,347 Bytes
854675f
 
 
9066e49
854675f
 
9066e49
854675f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import logging
import os

from config import LOG_LEVEL
__all__ = ["get_logger"]

DEFAULT_LOG_LEVEL = LOG_LEVEL

class ColoredFormatter(logging.Formatter):
    """Optional: Add colors for better readability in terminal"""

    # ANSI color codes
    COLORS = {
        'DEBUG': '\033[36m',  # Cyan
        'INFO': '\033[32m',  # Green
        'WARNING': '\033[33m',  # Yellow
        'ERROR': '\033[31m',  # Red
        'CRITICAL': '\033[35m',  # Magenta
    }
    RESET = '\033[0m'

    def format(self, record: logging.LogRecord) -> str:
        if record.levelname in self.COLORS:
            record.levelname = (
                f"{self.COLORS[record.levelname]}"
                f"[{record.levelname}]{self.RESET}"
            )
        return super().format(record)


def get_logger(
        name: str = "lifeflow",
        use_colors: bool = True,
        level: str = None
) -> logging.Logger:
    """
    取得 Logger 實例

    Args:
        name: Logger 名稱
        use_colors: 是否使用彩色輸出(預設開啟)

    Returns:
        Logger

    Example:
        logger = get_logger(__name__)
        logger.info("Operation completed")

        try:
            risky_operation()
        except Exception as e:
            logger.error("Operation failed", exc_info=True)

        logger.debug(f"Processing {len(items)} items")
    """
    logger = logging.getLogger(name)

    # 避免重複設定
    if logger.handlers:
        return logger

    log_level = os.getenv("LOG_LEVEL", DEFAULT_LOG_LEVEL) if level is None else level
    logger.setLevel(log_level.upper() if isinstance(log_level, str) else log_level)

    # 建立 Console Handler
    handler = logging.StreamHandler()
    handler.setLevel(log_level)

    # 選擇 Formatter
    if use_colors and os.getenv("NO_COLOR") is None:
        # 終端機支援顏色
        formatter = ColoredFormatter(
            fmt="%(levelname)-7s | %(asctime)s | %(name)s: %(message)s",
            datefmt="%H:%M:%S"
        )
    else:
        # 純文字(例如:導向檔案、CI/CD 環境)
        formatter = logging.Formatter(
            fmt="%(levelname)-5s | (asctime)s | %(name)s: %(message)s",
            datefmt="%Y-%m-%d %H:%M:%S"
        )

    handler.setFormatter(formatter)
    logger.addHandler(handler)
    logger.propagate = False
    return logger