logging.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from datetime import datetime, timezone
  2. import logging
  3. import os
  4. import sys
  5. # Suppress warnings from transformers
  6. # https://github.com/huggingface/transformers/issues/27214
  7. # Note: This should be set before importing transformers
  8. if "TRANSFORMERS_NO_ADVISORY_WARNINGS" not in os.environ:
  9. os.environ["TRANSFORMERS_NO_ADVISORY_WARNINGS"] = "1"
  10. TRACE_LEVEL = 5
  11. def setup_logging(debug: bool = False):
  12. level = logging.DEBUG if debug else logging.INFO
  13. logging.basicConfig(
  14. level=level,
  15. format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
  16. handlers=[logging.StreamHandler()],
  17. )
  18. logging.addLevelName(TRACE_LEVEL, "TRACE")
  19. logging.Logger.trace = trace
  20. logging.Formatter.formatTime = (
  21. lambda self, record, datefmt=None: datetime.fromtimestamp(
  22. record.created, timezone.utc
  23. ).astimezone()
  24. )
  25. # Third-party loggers to disable
  26. disable_logger_names = [
  27. "httpcore.connection",
  28. "httpcore.http11",
  29. "httpcore.proxy",
  30. "httpx",
  31. "asyncio",
  32. "aiocache.base",
  33. "urllib3.connectionpool",
  34. "multipart.multipart",
  35. "apscheduler.scheduler",
  36. "apscheduler.executors.default",
  37. "tzlocal",
  38. "alembic.runtime.migration",
  39. "python_multipart.multipart",
  40. "filelock",
  41. "fastapi-cdn-host",
  42. "huggingface_hub.file_download",
  43. "docker.auth",
  44. "kubernetes_asyncio.client.rest",
  45. "azure.core.pipeline.policies.http_logging_policy",
  46. "websockets.client",
  47. ]
  48. for logger_name in disable_logger_names:
  49. logger = logging.getLogger(logger_name)
  50. logger.disabled = True
  51. # Third-party loggers to print on debug
  52. debug_logger_names = [
  53. "alembic.runtime.migration",
  54. ]
  55. for logger_name in debug_logger_names:
  56. logger = logging.getLogger(logger_name)
  57. if debug:
  58. logger.setLevel(logging.DEBUG)
  59. else:
  60. logger.disabled = True
  61. def trace(self, message, *args, **kwargs):
  62. if self.isEnabledFor(TRACE_LEVEL):
  63. self._log(TRACE_LEVEL, message, args, **kwargs)
  64. class RedirectStdoutStderr:
  65. def __init__(self, target):
  66. self.target = target
  67. def __enter__(self):
  68. self.original_stdout = sys.stdout
  69. self.original_stderr = sys.stderr
  70. sys.stdout = self.target
  71. sys.stderr = self.target
  72. def __exit__(self, exc_type, exc_value, traceback):
  73. sys.stdout = self.original_stdout
  74. sys.stderr = self.original_stderr