| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- import logging
- import json
- import sys
- from datetime import datetime, timezone
- class JsonFormatter(logging.Formatter):
- """JSON 日志格式化器 (适合生产环境日志聚合)"""
- def format(self, record: logging.LogRecord) -> str:
- log_entry = {
- "timestamp": datetime.now(timezone.utc).isoformat(),
- "level": record.levelname,
- "logger": record.name,
- "message": record.getMessage(),
- }
- if hasattr(record, "trace_id"):
- log_entry["trace_id"] = record.trace_id
- if record.exc_info and record.exc_info[0]:
- log_entry["exception"] = self.formatException(record.exc_info)
- return json.dumps(log_entry, ensure_ascii=False)
- def setup_logging(level: str = "INFO", json_format: bool = False):
- root = logging.getLogger()
- root.setLevel(getattr(logging, level.upper(), logging.INFO))
- root.handlers.clear()
- handler = logging.StreamHandler(sys.stdout)
- if json_format:
- handler.setFormatter(JsonFormatter())
- else:
- handler.setFormatter(logging.Formatter(
- "%(asctime)s [%(levelname)s] %(name)s: %(message)s",
- datefmt="%Y-%m-%d %H:%M:%S",
- ))
- root.addHandler(handler)
- logging.getLogger("httpx").setLevel(logging.WARNING)
- logging.getLogger("chromadb").setLevel(logging.WARNING)
- logging.getLogger("langchain").setLevel(logging.WARNING)
|