Spaces:
Sleeping
Sleeping
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)}") |