53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
import logging
|
|
import os
|
|
from logging.handlers import RotatingFileHandler
|
|
|
|
# Define paths
|
|
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
# Fallback to local 'logs' dir if not overridden in Docker
|
|
LOGS_DIR = os.environ.get("LOGS_DIR", os.path.join(BASE_DIR, "logs"))
|
|
|
|
# Ensure directory exists
|
|
os.makedirs(LOGS_DIR, exist_ok=True)
|
|
|
|
LOG_FILE_PATH = os.path.join(LOGS_DIR, "backend.log")
|
|
|
|
def setup_logger():
|
|
logger = logging.getLogger("ainventory")
|
|
# Set to DEBUG for development; change to INFO for production
|
|
log_level = os.environ.get("LOG_LEVEL", "DEBUG")
|
|
logger.setLevel(getattr(logging, log_level.upper(), logging.INFO))
|
|
|
|
# Avoid duplicate handlers if setup multiple times
|
|
if logger.handlers:
|
|
return logger
|
|
|
|
formatter = logging.Formatter(
|
|
"[%(asctime)s] [%(levelname)s] [%(name)s] %(message)s",
|
|
datefmt="%Y-%m-%d %H:%M:%S"
|
|
)
|
|
|
|
# File Handler (10MB max, keep 5 backups)
|
|
try:
|
|
file_handler = RotatingFileHandler(
|
|
LOG_FILE_PATH, maxBytes=10*1024*1024, backupCount=5
|
|
)
|
|
file_handler.setFormatter(formatter)
|
|
logger.addHandler(file_handler)
|
|
|
|
# Special redirect for uvicorn logs to also go to file
|
|
logging.getLogger("uvicorn").addHandler(file_handler)
|
|
logging.getLogger("uvicorn.access").addHandler(file_handler)
|
|
except (PermissionError, IOError) as e:
|
|
logger.warning(f"⚠️ [LOGGING] Cannot write to log file at {LOG_FILE_PATH}: {e}")
|
|
logger.warning("⚠️ [LOGGING] Continuing with console-only output.")
|
|
|
|
# Console Handler (always registered)
|
|
console_handler = logging.StreamHandler()
|
|
console_handler.setFormatter(formatter)
|
|
logger.addHandler(console_handler)
|
|
|
|
return logger
|
|
|
|
log = setup_logger()
|