Source code for honeybee.logutil

import logging
from logging.handlers import TimedRotatingFileHandler
import os
import tempfile


# This is copied from logging module since python 2 doesn't have it under the same name.
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0

_name_to_level = {
    'CRITICAL': CRITICAL,
    'FATAL': FATAL,
    'ERROR': ERROR,
    'WARN': WARNING,
    'WARNING': WARNING,
    'INFO': INFO,
    'DEBUG': DEBUG,
    'NOTSET': NOTSET,
}


def _get_log_folder():
    home_folder = os.getenv('HOME') or os.path.expanduser('~')
    if not os.access(home_folder, os.W_OK):
        home_folder = tempfile.gettempdir()
    log_folder = os.path.join(home_folder, '.honeybee')
    if not os.path.isdir(log_folder):
        try:
            os.mkdir(log_folder)
        except OSError as e:
            if e.errno != 17:  # avoid race conditions between multiple tasks
                raise OSError('Failed to create log folder: %s\n%s' % (log_folder, e))
    return log_folder


def _get_log_level(level):
    level = _name_to_level.get(level)
    return level or logging.INFO


[docs]def get_logger(name, filename='honeybee.log', file_log_level='DEBUG', console_log_level='WARNING'): """Get a logger to be used for each module. Args: name: Logger name. The good practice is to set it to __init__ from inside each modules. filename: Logger filename.Setting filename to None will remove the file handler (Default: honeybee.log). file_log_level: Log level for file handler as a string (Default: DEBUG). console_log_level: Log level for stream handler as a string (Default: WARNING). """ logger = logging.getLogger(name) # create a file handler to log debug and higher level logs if filename: log_file = os.path.join(_get_log_folder(), filename) file_handler = TimedRotatingFileHandler(log_file, when='midnight') file_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') file_handler.setFormatter(file_format) file_handler.setLevel(_get_log_level(file_log_level)) logger.addHandler(file_handler) # create a console handler that only prints out errors and warnings stream_handler = logging.StreamHandler() stream_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s') stream_handler.setFormatter(stream_format) stream_handler.setLevel(_get_log_level(console_log_level)) logger.addHandler(stream_handler) return logger