|
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 |
|
|
|
|
|
|
|
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() |
|
|
|
|
|
if level is None: |
|
level_name = os.getenv('LOG_LEVEL', 'INFO') |
|
level = getattr(logging, level_name.upper(), logging.INFO) |
|
|
|
|
|
stream_handler = logging.StreamHandler(sys.stdout) |
|
stream_handler.setFormatter(ColorFormatter()) |
|
|
|
|
|
root_logger = logging.getLogger() |
|
root_logger.setLevel(level) |
|
|
|
|
|
root_logger.handlers = [] |
|
root_logger.addHandler(stream_handler) |
|
|
|
|
|
root_logger.propagate = False |
|
|
|
|
|
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) |
|
|
|
|
|
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)}") |