__init__.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. """Library setup."""
  2. import logging
  3. # Current version of the library
  4. __version__ = '3.0.0'
  5. def get_version():
  6. """
  7. Return a string with the current version of the library.
  8. :rtype: ``string``
  9. :return: Library version (e.g., "0.1.0").
  10. """
  11. return __version__
  12. def init_logging():
  13. """
  14. Initialize logging for testing.
  15. Temporary workaround for build timeouts by enabling logging to
  16. stdout so that Travis doesn't think the build has hung.
  17. """
  18. set_stream_logger(__name__, level=logging.DEBUG)
  19. class NullHandler(logging.Handler):
  20. """A null handler for the logger."""
  21. def emit(self, record):
  22. """Don't emit a log."""
  23. pass
  24. TRACE = 5 # Lower than debug which is 10
  25. class CBLogger(logging.Logger):
  26. """
  27. A custom logger, adds logging level below debug.
  28. Add a ``trace`` log level, numeric value 5: ``log.trace("Log message")``
  29. """
  30. def trace(self, msg, *args, **kwargs):
  31. """Add ``trace`` log level."""
  32. self.log(TRACE, msg, *args, **kwargs)
  33. # By default, do not force any logging by the library. If you want to see the
  34. # log messages in your scripts, add the following to the top of your script:
  35. # import cloudbridge
  36. # cloudbridge.set_stream_logger(__name__)
  37. # OR
  38. # cloudbridge.set_file_logger(__name__, '/tmp/log')
  39. default_format_string = "%(asctime)s [%(levelname)s] %(name)s: %(message)s"
  40. logging.setLoggerClass(CBLogger)
  41. logging.addLevelName(TRACE, "TRACE")
  42. log = logging.getLogger('cloudbridge')
  43. log.addHandler(NullHandler())
  44. # Convenience functions to set logging to a particular file or stream
  45. # To enable either of these by default within CloudBridge, add the following
  46. # at the top of a CloudBridge module:
  47. # import cloudbridge
  48. # cloudbridge.set_stream_logger(__name__)
  49. # OR
  50. # cloudbridge.set_file_logger(__name__, '/tmp/log')
  51. def set_stream_logger(name, level=TRACE, format_string=None):
  52. """A convenience method to set the global logger to stream."""
  53. global log
  54. if not format_string:
  55. format_string = default_format_string
  56. logger = logging.getLogger(name)
  57. logger.setLevel(level)
  58. fh = logging.StreamHandler()
  59. fh.setLevel(level)
  60. formatter = logging.Formatter(format_string)
  61. fh.setFormatter(formatter)
  62. logger.addHandler(fh)
  63. log = logger
  64. def set_file_logger(name, filepath, level=logging.INFO, format_string=None):
  65. """A convenience method to set the global logger to a file."""
  66. global log
  67. if not format_string:
  68. format_string = default_format_string
  69. logger = logging.getLogger(name)
  70. logger.setLevel(level)
  71. fh = logging.FileHandler(filepath)
  72. fh.setLevel(level)
  73. formatter = logging.Formatter(format_string)
  74. fh.setFormatter(formatter)
  75. logger.addHandler(fh)
  76. log = logger