import logging
import abc
import traceback
from media.monitor.pure import LazyProperty

appname = 'root'

def setup_logging(log_path):
    """
    Setup logging by writing log to 'log_path'
    """
    #logger = logging.getLogger(appname)
    logging.basicConfig(filename=log_path, level=logging.DEBUG)

def get_logger():
    """
    in case we want to use the common logger from a procedural interface
    """
    return logging.getLogger()

class Loggable(object):
    """
    Any class that wants to log can inherit from this class and automatically
    get a logger attribute that can be used like: self.logger.info(...) etc.
    """
    __metaclass__ = abc.ABCMeta
    @LazyProperty
    def logger(self): return get_logger()

    def unexpected_exception(self,e):
        """
        Default message for 'unexpected' exceptions
        """
        self.fatal_exception("'Unexpected' exception has occured:", e)

    def fatal_exception(self, message, e):
        """
        Prints an exception 'e' with 'message'. Also outputs the traceback.
        """
        self.logger.error( message )
        self.logger.error( str(e) )
        self.logger.error( traceback.format_exc() )