patch.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. # -*- coding: utf-8 -*-
  2. """
  3. celery.utils.patch
  4. ~~~~~~~~~~~~~~~~~~
  5. Monkey-patch to ensure loggers are process aware.
  6. :copyright: (c) 2009 - 2011 by Ask Solem.
  7. :license: BSD, see LICENSE for more details.
  8. """
  9. from __future__ import absolute_import
  10. import logging
  11. _process_aware = False
  12. def _patch_logger_class():
  13. """Make sure process name is recorded when loggers are used."""
  14. try:
  15. from multiprocessing.process import current_process
  16. except ImportError:
  17. current_process = None # noqa
  18. logging._acquireLock()
  19. try:
  20. OldLoggerClass = logging.getLoggerClass()
  21. if not getattr(OldLoggerClass, '_process_aware', False):
  22. class ProcessAwareLogger(OldLoggerClass):
  23. _process_aware = True
  24. def makeRecord(self, *args, **kwds):
  25. record = OldLoggerClass.makeRecord(self, *args, **kwds)
  26. if current_process:
  27. record.processName = current_process()._name
  28. else:
  29. record.processName = ""
  30. return record
  31. logging.setLoggerClass(ProcessAwareLogger)
  32. finally:
  33. logging._releaseLock()
  34. def ensure_process_aware_logger():
  35. global _process_aware
  36. if not _process_aware:
  37. _patch_logger_class()
  38. _process_aware = True