You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

utils.py 1.3 kB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import json
  2. import logging
  3. import sys
  4. from datetime import datetime
  5. from pydantic import BaseModel
  6. class FileLogHandler(logging.Handler):
  7. def __init__(self, filename: str) -> None:
  8. super().__init__()
  9. self.filename = filename
  10. self.file_handler = logging.FileHandler(filename)
  11. def emit(self, record: logging.LogRecord) -> None:
  12. ts = datetime.fromtimestamp(record.created).isoformat()
  13. if isinstance(record.msg, BaseModel):
  14. record.msg = json.dumps(
  15. {
  16. "timestamp": ts,
  17. "message": record.msg.model_dump(),
  18. "type": record.msg.__class__.__name__,
  19. },
  20. )
  21. self.file_handler.emit(record)
  22. class ConsoleLogHandler(logging.Handler):
  23. def emit(self, record: logging.LogRecord) -> None:
  24. ts = datetime.fromtimestamp(record.created).isoformat()
  25. if isinstance(record.msg, BaseModel):
  26. record.msg = json.dumps(
  27. {
  28. "timestamp": ts,
  29. "message": record.msg.model_dump_json(indent=2),
  30. "type": record.msg.__class__.__name__,
  31. },
  32. )
  33. sys.stdout.write(f"{record.msg}\n")