File size: 2,264 Bytes
99269d6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import logging


# Function to convert HEX to ANSI 24-bit escape code
def hex_to_ansi(hex_color, is_background=False):
    """Convert a hex color code to an ANSI escape sequence."""
    hex_color = hex_color.lstrip("#")  # Remove '#' if present
    if len(hex_color) != 6:
        raise ValueError("Invalid hex color format. Use #RRGGBB.")

    r, g, b = int(hex_color[0:2], 16), int(hex_color[2:4], 16), int(hex_color[4:6], 16)
    return f"\033[{48 if is_background else 38};2;{r};{g};{b}m"

# Custom log formatter with level-specific colors
class ColoredFormatter(logging.Formatter):
    # Define hex colors per log level
    COLORS = {
        "DEBUG":    {"HEADER": "#1E3A8A", "TIMESTAMP": "#2563EB"},  # Dark Blue / Blue
        "INFO":     {"HEADER": "#166534", "TIMESTAMP": "#22C55E"},  # Dark Green / Green
        "WARNING":  {"HEADER": "#92400E", "TIMESTAMP": "#FACC15"},  # Dark Yellow / Yellow
        "ERROR":    {"HEADER": "#7F1D1D", "TIMESTAMP": "#EF4444"},  # Dark Red / Red
        "CRITICAL": {"HEADER": "#581C87", "TIMESTAMP": "#C084FC"},  # Dark Purple / Purple
    }

    def format(self, record):
        # Extract filename and line number
        filename = record.pathname.split("/")[-1]
        line_no = record.lineno
        level_name = record.levelname

        # Choose colors based on log level
        level_colors = self.COLORS.get(level_name, self.COLORS["INFO"])
        header_color = hex_to_ansi(level_colors["HEADER"])
        timestamp_color = hex_to_ansi(level_colors["TIMESTAMP"])
        reset_color = "\033[0m"  # Reset to default terminal color

        # Format header as "[LEVEL|file.py:line]"
        header = f"{header_color}[{level_name}|{filename}:{line_no}]{reset_color}"

        # Format timestamp
        timestamp = f"{timestamp_color}{self.formatTime(record, self.datefmt)}{reset_color}"

        # Format message
        message = f"\033[37m{record.getMessage()}{reset_color}"  # White message

        return f"{header} {timestamp} >> {message}"


# Set up logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
console_handler = logging.StreamHandler()
formatter = ColoredFormatter(datefmt="%Y-%m-%d %H:%M:%S")
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)