__init__.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. """Library setup."""
  2. import logging
  3. # Current version of the library
  4. __version__ = '3.2.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. TRACE = 5 # Lower than debug which is 10
  20. class CBLogger(logging.Logger):
  21. """
  22. A custom logger, adds logging level below debug.
  23. Add a ``trace`` log level, numeric value 5: ``log.trace("Log message")``
  24. """
  25. def trace(self, msg, *args, **kwargs):
  26. """Add ``trace`` log level."""
  27. self.log(TRACE, msg, *args, **kwargs)
  28. # By default, do not force any logging by the library. If you want to see the
  29. # log messages in your scripts, add the following to the top of your script:
  30. # import cloudbridge
  31. # cloudbridge.set_stream_logger(__name__)
  32. # OR
  33. # cloudbridge.set_file_logger(__name__, '/tmp/log')
  34. default_format_string = "%(asctime)s [%(levelname)s] %(name)s: %(message)s"
  35. logging.setLoggerClass(CBLogger)
  36. logging.addLevelName(TRACE, "TRACE")
  37. log = logging.getLogger('cloudbridge')
  38. log.addHandler(logging.NullHandler())
  39. # Convenience functions to set logging to a particular file or stream
  40. # To enable either of these by default within CloudBridge, add the following
  41. # at the top of a CloudBridge module:
  42. # import cloudbridge
  43. # cloudbridge.set_stream_logger(__name__)
  44. # OR
  45. # cloudbridge.set_file_logger(__name__, '/tmp/log')
  46. def set_stream_logger(name, level=TRACE, format_string=None):
  47. """A convenience method to set the global logger to stream."""
  48. global log
  49. if not format_string:
  50. format_string = default_format_string
  51. logger = logging.getLogger(name)
  52. logger.setLevel(level)
  53. fh = logging.StreamHandler()
  54. fh.setLevel(level)
  55. formatter = logging.Formatter(format_string)
  56. fh.setFormatter(formatter)
  57. logger.addHandler(fh)
  58. log = logger
  59. def set_file_logger(name, filepath, level=logging.INFO, format_string=None):
  60. """A convenience method to set the global logger to a file."""
  61. global log
  62. if not format_string:
  63. format_string = default_format_string
  64. logger = logging.getLogger(name)
  65. logger.setLevel(level)
  66. fh = logging.FileHandler(filepath)
  67. fh.setLevel(level)
  68. formatter = logging.Formatter(format_string)
  69. fh.setFormatter(formatter)
  70. logger.addHandler(fh)
  71. log = logger