112 lines
3.1 KiB
Python
112 lines
3.1 KiB
Python
|
import logging
|
||
|
import os
|
||
|
import sys
|
||
|
|
||
|
import colorama
|
||
|
from pythonjsonlogger import jsonlogger
|
||
|
from ansible.module_utils.parsing.convert_bool import boolean as to_bool
|
||
|
|
||
|
|
||
|
def should_do_markup():
|
||
|
py_colors = os.environ.get('PY_COLORS', None)
|
||
|
if py_colors is not None:
|
||
|
return to_bool(py_colors, strict=False)
|
||
|
|
||
|
return sys.stdout.isatty() and os.environ.get('TERM') != 'dumb'
|
||
|
|
||
|
|
||
|
colorama.init(autoreset=True, strip=not should_do_markup())
|
||
|
|
||
|
|
||
|
class LogFilter(object):
|
||
|
"""
|
||
|
A custom log filter which excludes log messages above the logged
|
||
|
level.
|
||
|
"""
|
||
|
|
||
|
def __init__(self, level):
|
||
|
self.__level = level
|
||
|
|
||
|
def filter(self, logRecord): # pragma: no cover
|
||
|
# https://docs.python.org/3/library/logging.html#logrecord-attributes
|
||
|
return logRecord.levelno <= self.__level
|
||
|
|
||
|
|
||
|
def get_logger(name=None, level=logging.DEBUG, json=False):
|
||
|
"""
|
||
|
Build a logger with the given name and returns the logger.
|
||
|
:param name: The name for the logger. This is usually the module
|
||
|
name, ``__name__``.
|
||
|
:return: logger object
|
||
|
"""
|
||
|
|
||
|
logger = logging.getLogger(name)
|
||
|
logger.setLevel(level)
|
||
|
#handler = logging.StreamHandler()
|
||
|
#formatter = jsonlogger.JsonFormatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
|
||
|
#formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
|
||
|
#handler.setFormatter(formatter)
|
||
|
logger.addHandler(_get_error_handler(json=json))
|
||
|
logger.addHandler(_get_warn_handler(json=json))
|
||
|
logger.addHandler(_get_info_handler(json=json))
|
||
|
logger.propagate = False
|
||
|
|
||
|
return logger
|
||
|
|
||
|
|
||
|
def _get_error_handler(json=False):
|
||
|
handler = logging.StreamHandler(sys.stderr)
|
||
|
handler.setLevel(logging.ERROR)
|
||
|
handler.addFilter(LogFilter(logging.ERROR))
|
||
|
handler.setFormatter(logging.Formatter(error('%(message)s')))
|
||
|
|
||
|
if json:
|
||
|
handler.setFormatter(jsonlogger.JsonFormatter('%(message)s'))
|
||
|
|
||
|
return handler
|
||
|
|
||
|
|
||
|
def _get_warn_handler(json=False):
|
||
|
handler = logging.StreamHandler(sys.stdout)
|
||
|
handler.setLevel(logging.WARN)
|
||
|
handler.addFilter(LogFilter(logging.WARN))
|
||
|
handler.setFormatter(logging.Formatter(warn('%(message)s')))
|
||
|
|
||
|
if json:
|
||
|
handler.setFormatter(jsonlogger.JsonFormatter('%(message)s'))
|
||
|
|
||
|
return handler
|
||
|
|
||
|
|
||
|
def _get_info_handler(json=False):
|
||
|
handler = logging.StreamHandler(sys.stderr)
|
||
|
handler.setLevel(logging.INFO)
|
||
|
handler.addFilter(LogFilter(logging.INFO))
|
||
|
handler.setFormatter(logging.Formatter(info('%(message)s')))
|
||
|
|
||
|
if json:
|
||
|
handler.setFormatter(jsonlogger.JsonFormatter('%(message)s'))
|
||
|
|
||
|
return handler
|
||
|
|
||
|
|
||
|
def abort(message, file=sys.stderr):
|
||
|
return color_text(colorama.Fore.RED, "FATAL: {}".format(message))
|
||
|
sys.exit(1)
|
||
|
|
||
|
|
||
|
def error(message):
|
||
|
return color_text(colorama.Fore.RED, "ERROR: {}".format(message))
|
||
|
|
||
|
|
||
|
def warn(message):
|
||
|
return color_text(colorama.Fore.YELLOW, "WARN: {}".format(message))
|
||
|
|
||
|
|
||
|
def info(message):
|
||
|
return color_text(colorama.Fore.BLUE, "INFO: {}".format(message))
|
||
|
|
||
|
|
||
|
def color_text(color, msg):
|
||
|
return '{}{}{}'.format(color, msg, colorama.Style.RESET_ALL)
|