def configure_logging(stream, logger=None, is_verbose=False): """Configure logging, and return the list of handlers added. Returns: A list of references to the logging handlers added to the root logger. This allows the caller to later remove the handlers using logger.removeHandler. This is useful primarily during unit testing where the caller may want to configure logging temporarily and then undo the configuring. Args: stream: A file-like object to which to log. The stream must define an "encoding" data attribute, or else logging raises an error. logger: A logging.logger instance to configure. This parameter should be used only in unit tests. Defaults to the root logger. is_verbose: A boolean value of whether logging should be verbose. """ # If the stream does not define an "encoding" data attribute, the # logging module can throw an error like the following: # # Traceback (most recent call last): # File "/System/Library/Frameworks/Python.framework/Versions/2.6/... # lib/python2.6/logging/__init__.py", line 761, in emit # self.stream.write(fs % msg.encode(self.stream.encoding)) # LookupError: unknown encoding: unknown if logger is None: logger = logging.getLogger() if is_verbose: logging_level = logging.DEBUG handlers = _create_debug_log_handlers(stream) else: logging_level = logging.INFO handlers = _create_log_handlers(stream) handlers = _configure_logging(logging_level=logging_level, logger=logger, handlers=handlers) return handlers