Source code for calliope.core.util.logging


"""
Copyright (C) 2013-2019 Calliope contributors listed in AUTHORS.
Licensed under the Apache 2.0 License (see LICENSE file).

logger.py
~~~~~~~~~~

Create the Calliope logger object and apply other logging tools/functionality

"""

import datetime
import logging
import sys

_time_format = '%Y-%m-%d %H:%M:%S'


def setup_root_logger(verbosity, capture_warnings):
    root_logger = logging.getLogger()  # Get the root logger

    # Remove any existing output handlers from root logger
    if root_logger.hasHandlers():
        for handler in root_logger.handlers:
            root_logger.removeHandler(handler)

    # Create a console log handler with decent formatting and attach it
    formatter = logging.Formatter(
        '[%(asctime)s] %(levelname)-8s %(message)s', datefmt=_time_format)
    console = logging.StreamHandler(stream=sys.stdout)
    console.setFormatter(formatter)
    root_logger.addHandler(console)
    root_logger.setLevel(verbosity.upper())

    if capture_warnings:
        logging.captureWarnings(True)
        pywarning_logger = logging.getLogger('py.warnings')
        pywarning_logger.setLevel(verbosity.upper())

    return root_logger


[docs]def set_log_verbosity( verbosity='info', include_solver_output=True, capture_warnings=True ): """ Set the verbosity of logging and setup the root logger to log to console (stdout) with timestamp output formatting. Parameters ---------- verbosity : str, default 'info' Logging level to display across all of Calliope. Can be one of 'debug', 'info', 'warning', 'error', or 'critical'. include_solver_output : bool, default True If True, the logging level for just the backend model is set to DEBUG, which turns on display of solver output. capture_warnings : bool, default True If True, also capture all warnings and log them to the WARNING level. This results in more consistent output when running interactively. """ backend_logger = logging.getLogger('calliope.backend.pyomo.model') if include_solver_output is True: backend_logger.setLevel('DEBUG') else: backend_logger.setLevel(verbosity.upper()) setup_root_logger( verbosity=verbosity, capture_warnings=capture_warnings )
def log_time(logger, timings, identifier, comment=None, level='info', time_since_run_start=False): if comment is None: comment = identifier timings[identifier] = now = datetime.datetime.now() if time_since_run_start and 'run_start' in timings: time_diff = now - timings['run_start'] comment += '. Time since start of model run: {}'.format(time_diff) getattr(logger, level)(comment) class LogWriter: def __init__(self, logger, level, strip=False): self.logger = logger self.level = level self.strip = strip def write(self, message): if message != '\n': if self.strip: message = message.strip() getattr(self.logger, self.level)(message) def flush(self): pass