log_config.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import logging
  2. import json
  3. import sys
  4. from datetime import datetime, timezone
  5. class JsonFormatter(logging.Formatter):
  6. """JSON 日志格式化器 (适合生产环境日志聚合)"""
  7. def format(self, record: logging.LogRecord) -> str:
  8. log_entry = {
  9. "timestamp": datetime.now(timezone.utc).isoformat(),
  10. "level": record.levelname,
  11. "logger": record.name,
  12. "message": record.getMessage(),
  13. }
  14. if hasattr(record, "trace_id"):
  15. log_entry["trace_id"] = record.trace_id
  16. if record.exc_info and record.exc_info[0]:
  17. log_entry["exception"] = self.formatException(record.exc_info)
  18. return json.dumps(log_entry, ensure_ascii=False)
  19. def setup_logging(level: str = "INFO", json_format: bool = False):
  20. root = logging.getLogger()
  21. root.setLevel(getattr(logging, level.upper(), logging.INFO))
  22. root.handlers.clear()
  23. handler = logging.StreamHandler(sys.stdout)
  24. if json_format:
  25. handler.setFormatter(JsonFormatter())
  26. else:
  27. handler.setFormatter(logging.Formatter(
  28. "%(asctime)s [%(levelname)s] %(name)s: %(message)s",
  29. datefmt="%Y-%m-%d %H:%M:%S",
  30. ))
  31. root.addHandler(handler)
  32. logging.getLogger("httpx").setLevel(logging.WARNING)
  33. logging.getLogger("chromadb").setLevel(logging.WARNING)
  34. logging.getLogger("langchain").setLevel(logging.WARNING)