log.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. """celery.log"""
  2. import os
  3. import sys
  4. import time
  5. import logging
  6. from celery.conf import LOG_FORMAT, DAEMON_LOG_LEVEL
  7. def setup_logger(loglevel=DAEMON_LOG_LEVEL, logfile=None, format=LOG_FORMAT,
  8. **kwargs):
  9. """Setup the ``multiprocessing`` logger. If ``logfile`` is not specified,
  10. ``stderr`` is used.
  11. Returns logger object.
  12. """
  13. import multiprocessing
  14. logger = multiprocessing.get_logger()
  15. for handler in logger.handlers:
  16. if hasattr(handler, "close"):
  17. handler.close()
  18. logger.handlers = []
  19. if logfile:
  20. if hasattr(logfile, "write"):
  21. log_file_handler = logging.StreamHandler(logfile)
  22. else:
  23. log_file_handler = logging.FileHandler(logfile)
  24. formatter = logging.Formatter(format)
  25. log_file_handler.setFormatter(formatter)
  26. logger.addHandler(log_file_handler)
  27. else:
  28. multiprocessing.log_to_stderr()
  29. logger.setLevel(loglevel)
  30. return logger
  31. def emergency_error(logfile, message):
  32. """Emergency error logging, for when there's no standard file
  33. descriptors open because the process has been daemonized or for
  34. some other reason."""
  35. logfh_needs_to_close = False
  36. if not logfile:
  37. logfile = sys.stderr
  38. if hasattr(logfile, "write"):
  39. logfh = logfile
  40. else:
  41. logfh = open(logfile, "a")
  42. logfh_needs_to_close = True
  43. logfh.write("[%(asctime)s: FATAL/%(pid)d]: %(message)s\n" % {
  44. "asctime": time.asctime(),
  45. "pid": os.getpid(),
  46. "message": message})
  47. if logfh_needs_to_close:
  48. logfh.close()