Source code for nboost.logger
"""Logger for NBoost classes"""
import termcolor
import logging
import copy
import os
[docs]def set_logger(context, verbose=False):
"""Return colored logger with specified context name and debug=verbose"""
if os.name == 'nt': # for Windows
return NTLogger(context, verbose)
# Remove all handlers associated with the root logger object.
for handler in logging.root.handlers[:]:
logging.root.removeHandler(handler)
logger = logging.getLogger(context)
logger.propagate = False
if not logger.handlers:
logger.setLevel(logging.DEBUG if verbose else logging.INFO)
formatter = ColoredFormatter(
'%(levelname)-.1s:' + context +
':[%(filename).3s:%(funcName).3s:%(lineno)3d]:%(message)s',
datefmt='%m-%d %H:%M:%S')
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG if verbose else logging.INFO)
console_handler.setFormatter(formatter)
logger.handlers = []
logger.addHandler(console_handler)
return logger
[docs]class NTLogger:
"""Windows support for logger"""
def __init__(self, context, verbose):
self.context = context
self.verbose = verbose
self.info = self.format_msg('I:%s:%s')
self.debug = self.format_msg('D:%s:%s')
self.error = self.format_msg('E:%s:%s')
self.warning = self.format_msg('W:%s:%s')
[docs] def format_msg(self, string_format: str):
"""Format incoming logging messages with a given format"""
def func(msg: str, **_):
"""Function to replace incoming stream"""
print(string_format % (self.context, msg), flush=True)
return func
[docs]class ColoredFormatter(logging.Formatter):
"""Format log levels with color"""
MAPPING = {
'DEBUG': dict(color='green', on_color=None),
'INFO': dict(color='cyan', on_color=None),
'WARNING': dict(color='yellow', on_color=None),
'ERROR': dict(color='grey', on_color='on_red'),
'CRITICAL': dict(color='grey', on_color='on_blue'),
}
PREFIX = '\033['
SUFFIX = '\033[0m'
[docs] def format(self, record):
"""Add log ansi colors"""
crecord = copy.copy(record)
seq = self.MAPPING.get(crecord.levelname, self.MAPPING['INFO'])
crecord.msg = termcolor.colored(crecord.msg, **seq)
return super().format(crecord)