Source code for calliope.core.util.logging
"""
Copyright (C) since 2013 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