Source code for calliope.core.util.logging
"""
Copyright (C) 2013-2018 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 logging
import sys
import datetime
SOLVER = 19
logging.addLevelName(SOLVER, 'SOLVER')
logger = logging.getLogger('calliope')
logger.propagate = False
if logger.hasHandlers():
for handler in logger.handlers:
logger.removeHandler(handler)
formatter = logging.Formatter(
'[%(asctime)s] %(levelname)s: %(message)s',
datefmt="%Y-%m-%d %H:%M:%S")
console = logging.StreamHandler(stream=sys.stdout)
console.setFormatter(formatter)
logger.addHandler(console)
[docs]def set_log_level(level):
"""
Set the minimum logging verbosity in a Python console. Higher verbosity levels
will include their output and all those of following levels.
Level options (in descending order of verbosity):
* 'DEBUG'
* 'SOLVER' -> Calliope custom level, assigned value of 19,
returns solver (e.g. GLPK) stream
* 'INFO' -> default level
* 'WARNING'
* 'ERROR'
* 'CRITICAL'
"""
if level == 'DEBUG':
logger.setLevel(logging.DEBUG)
elif level == 'SOLVER':
logger.setLevel(SOLVER)
else:
logger.setLevel(getattr(logging, level))
def log_time(timings, identifier, comment=None, level='info', time_since_start=False):
if comment is None:
comment = identifier
timings[identifier] = now = datetime.datetime.now()
if time_since_start:
time_diff = now - timings['model_creation']
comment += '. Time since start: {}'.format(time_diff)
getattr(logger, level)(comment)
class LogWriter:
def __init__(self, level, strip=False):
self.level = level
self.strip = strip
def write(self, message):
if message != '\n':
if self.strip:
message = message.strip()
if self.level == 'solver':
logger.log(SOLVER, message)
else:
getattr(logger, self.level)(message)
def flush(self):
pass