twisted_logger.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import logging
  2. from twisted.python import reflect
  3. from twisted.python import log
  4. from BTL import defer # for failure decoration
  5. class LogLogObserver(log.FileLogObserver):
  6. """Log observer that writes to a python logger."""
  7. def __init__(self, error_log_level, info_log_level ):
  8. self.error_log_level = error_log_level
  9. self.info_log_level = info_log_level
  10. def emit(self, eventDict):
  11. system = eventDict['system']
  12. if system == '-':
  13. system = 'twisted'
  14. else:
  15. system = 'twisted.' + system
  16. logger = logging.getLogger(system)
  17. # This next line is obnoxious. --Dave
  18. #logger.setLevel(logging.DEBUG)
  19. edm = eventDict['message'] or ''
  20. if eventDict['isError'] and eventDict.has_key('failure'):
  21. if not edm:
  22. edm = 'Failure:'
  23. logger.log(self.error_log_level,
  24. edm, exc_info=eventDict['failure'].exc_info())
  25. elif eventDict.has_key('format'):
  26. text = self._safeFormat(eventDict['format'], eventDict)
  27. logger.log(self.info_log_level, text)
  28. else:
  29. text = ' '.join(map(reflect.safe_str, edm))
  30. logger.log(self.info_log_level, text)
  31. def start(error_log_level = logging.ERROR,
  32. info_log_level = logging.INFO ):
  33. """Writes twisted output to a logger using 'twisted' as the
  34. logger name (i.e., 'twisted' is passed as name arg to logging.getLogger(name)).
  35. """
  36. o = LogLogObserver(error_log_level, info_log_level)
  37. # We do not use twisted setStdout logging because it is not clear to me
  38. # how to differentiate twisted-generated log entries and
  39. # redirected output. It is possible that all stdout and stderr
  40. # output has system '-', but from looking at twisted source code
  41. # there does not appear to be any guarantee that this is the case.
  42. # A simpler way of handling this is to simply separate
  43. # stdio and stderr redirection from twisted logging. --Dave
  44. log.startLoggingWithObserver(o.emit , setStdout = 0) #setStdout=int(capture_output))