File size: 2,877 Bytes
5ef2360
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import logging
import sys
import os

LOGS_DIR = "logs"

class ColorFormatter(logging.Formatter):
    """Custom formatter that adds colors to log levels"""
    
    grey = "\x1b[38;20m"
    yellow = "\x1b[33;20m"
    red = "\x1b[31;20m"
    bold_red = "\x1b[31;1m"
    blue = "\x1b[34;20m"
    green = "\x1b[32;20m"
    reset = "\x1b[0m"
    
    format_str = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    
    FORMATS = {
        logging.DEBUG: blue + format_str + reset,
        logging.INFO: green + format_str + reset,
        logging.WARNING: yellow + format_str + reset,
        logging.ERROR: red + format_str + reset,
        logging.CRITICAL: bold_red + format_str + reset
    }

    def format(self, record):
        log_fmt = self.FORMATS.get(record.levelno)
        formatter = logging.Formatter(log_fmt, datefmt='%Y-%m-%d %H:%M:%S')
        return formatter.format(record)

def configure_logfire():
    import logfire
    # First run `logfire auth`
    # -> Your Logfire credentials are stored in <path>/.logfire/default.toml
    
    def scrubbing_callback(m: logfire.ScrubMatch):
        if m.pattern_match.group(0) == 'Credit Card':
            return m.value

    logfire.configure(scrubbing=logfire.ScrubbingOptions(callback=scrubbing_callback))

def setup_logging(level=None, with_logfire=False):
    """Configure logging for the entire application"""
    if with_logfire:
        configure_logfire()

    # Get level from environment variable or use default
    if level is None:
        level_name = os.getenv('LOG_LEVEL', 'INFO')
        level = getattr(logging, level_name.upper(), logging.INFO)
    
    # Configure stream handler (console output) with color formatter
    stream_handler = logging.StreamHandler(sys.stdout)
    stream_handler.setFormatter(ColorFormatter())

    # Configure root logger
    root_logger = logging.getLogger()
    root_logger.setLevel(level)
    
    # Remove existing handlers
    root_logger.handlers = []
    root_logger.addHandler(stream_handler)

    # Prevent duplicate logging
    root_logger.propagate = False

    # Optionally configure file handler
    os.makedirs(LOGS_DIR, exist_ok=True)
    file_handler = logging.FileHandler(os.path.join(LOGS_DIR, 'app.log'))
    file_handler.setFormatter(logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    ))
    root_logger.addHandler(file_handler)

    # Get comma-separated list of loggers to suppress from env
    suppress_loggers = os.getenv('SUPPRESS_LOGGERS', '').strip()
    if suppress_loggers:
        for logger_name in suppress_loggers.split(','):
            logger_name = logger_name.strip()
            if logger_name:
                logging.getLogger(logger_name).setLevel(logging.WARNING)

    logging.info(f"Logging configured with level: {logging.getLevelName(level)}")