28 lines
934 B
Python
28 lines
934 B
Python
import json
|
|||
|
|
import logging
|
||
|
|
import sys
|
||
|
|
from typing import Any, Dict
|
||
|
|
|
||
|
|
|
||
|
|
class JsonFormatter(logging.Formatter):
|
||
|
|
"""统一 JSON 日志,方便跨服务链路排查"""
|
||
|
|
|
||
|
|
def format(self, record: logging.LogRecord) -> str: # type: ignore[override]
|
||
|
|
log: Dict[str, Any] = {
|
||
|
|
"ts": self.formatTime(record, datefmt="%Y-%m-%dT%H:%M:%S%z"),
|
||
|
|
"level": record.levelname,
|
||
|
|
"logger": record.name,
|
||
|
|
"message": record.getMessage(),
|
||
|
|
}
|
||
|
|
if record.exc_info:
|
||
|
|
log["exc_info"] = self.formatException(record.exc_info)
|
||
|
|
for key, value in getattr(record, "extra", {}).items():
|
||
|
|
log[key] = value
|
||
|
|
return json.dumps(log, ensure_ascii=False)
|
||
|
|
|
||
|
|
|
||
|
|
def setup_logging(level: str = "INFO") -> None:
|
||
|
|
handler = logging.StreamHandler(sys.stdout)
|
||
|
|
handler.setFormatter(JsonFormatter())
|
||
|
|
logging.basicConfig(handlers=[handler], level=level, force=True)
|