96 lines
2.4 KiB
Python
96 lines
2.4 KiB
Python
from __future__ import annotations
|
|
|
|
import logging
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from django.conf import settings
|
|
from loguru import logger
|
|
|
|
_CONFIGURED = False
|
|
|
|
|
|
def _is_truthy(value: str | None) -> bool:
|
|
if value is None:
|
|
return False
|
|
return value.lower() in {"1", "true", "yes", "on"}
|
|
|
|
|
|
def _get_stdout_level() -> str:
|
|
env_level = os.environ.get("LOGURU_STDOUT_LEVEL")
|
|
if env_level:
|
|
return env_level
|
|
|
|
debug_flag = os.environ.get("DEBUG")
|
|
if debug_flag is None:
|
|
try:
|
|
debug_flag = "1" if getattr(settings, "DEBUG", False) else "0"
|
|
except Exception:
|
|
debug_flag = "0"
|
|
|
|
return "DEBUG" if _is_truthy(debug_flag) else "INFO"
|
|
|
|
|
|
def _get_log_file_path() -> Path:
|
|
override = os.environ.get("LOGURU_FILE")
|
|
if override:
|
|
return Path(override)
|
|
|
|
try:
|
|
logging_config = getattr(settings, "LOGGING", None) or {}
|
|
handler = (logging_config.get("handlers") or {}).get("file") or {}
|
|
filename = handler.get("filename")
|
|
if filename:
|
|
path = Path(filename)
|
|
if path.is_absolute():
|
|
return path
|
|
return Path(getattr(settings, "BASE_DIR", Path.cwd())) / path
|
|
except Exception:
|
|
pass
|
|
|
|
try:
|
|
return Path(getattr(settings, "BASE_DIR", Path.cwd())) / "logs" / "app.log"
|
|
except Exception:
|
|
return Path.cwd() / "logs" / "app.log"
|
|
|
|
|
|
def get_log_file_path() -> Path:
|
|
return _get_log_file_path()
|
|
|
|
|
|
def configure_loguru() -> Path:
|
|
global _CONFIGURED
|
|
if _CONFIGURED:
|
|
return _get_log_file_path()
|
|
|
|
log_file_path = get_log_file_path()
|
|
log_file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
stdout_level = _get_stdout_level()
|
|
log_format = "[{time:DD/MMM/YYYY HH:mm:ss}] {level} [{name}:{line}] {message}"
|
|
|
|
logger.remove()
|
|
logger.add(
|
|
sys.stdout,
|
|
level=stdout_level,
|
|
enqueue=True,
|
|
backtrace=False,
|
|
diagnose=False,
|
|
format=log_format,
|
|
)
|
|
logger.add(
|
|
str(log_file_path),
|
|
level="DEBUG",
|
|
enqueue=True,
|
|
backtrace=True,
|
|
diagnose=False,
|
|
format=log_format + "\n{exception}",
|
|
rotation="10 MB",
|
|
retention="10 days",
|
|
)
|
|
|
|
logging.root.setLevel(logging.DEBUG)
|
|
_CONFIGURED = True
|
|
logger.debug("Loguru logging configured with stdout and file sinks (stdout={})", stdout_level)
|
|
return log_file_path
|