File size: 1,715 Bytes
8ba64a4 e85027d 8ba64a4 |
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 |
import logging
import os
from logging.handlers import RotatingFileHandler
import traceback
def exception_to_str(e: Exception, max_lines: int = 12) -> str:
"""
Convert an exception to a string, limiting the number of lines.
"""
exception_message = "\n".join(str(e).splitlines()[:2])
stack_trace = "".join(traceback.format_tb(e.__traceback__))
exception_str = exception_message + "\n" + stack_trace
lines = exception_str.splitlines()
if len(lines) > max_lines:
exception_str = "\n".join(lines[:max_lines]) + "\n... (truncated)"
return exception_str
# Configure logger
def setup_logger(name: str) -> logging.Logger:
log_level = os.getenv("LOG_LEVEL", "INFO").upper()
log_file = os.getenv("LOG_FILE", "app.log")
max_bytes = int(os.getenv("LOG_MAX_BYTES", 10 * 1024 * 1024)) # 10 MB
backup_count = int(os.getenv("LOG_BACKUP_COUNT", 5))
logger = logging.getLogger(name)
logger.setLevel(log_level)
# Console handler
console_handler = logging.StreamHandler()
console_handler.setLevel(log_level)
console_formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
console_handler.setFormatter(console_formatter)
# Rotating file handler
file_handler = RotatingFileHandler(
log_file, maxBytes=max_bytes, backupCount=backup_count
)
file_handler.setLevel(log_level)
file_formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
file_handler.setFormatter(file_formatter)
# Add handlers
logger.addHandler(console_handler)
logger.addHandler(file_handler)
logger.propagate = False
return logger
|