From 397c92a27bf52f6bf467b68f43adb27c8629c00f Mon Sep 17 00:00:00 2001 From: Robert Kaussow Date: Fri, 5 Apr 2019 12:23:18 +0200 Subject: [PATCH] add better multiline logging and fix json format issues --- ansiblelater/command/candidates.py | 27 +++++++++++++++----- ansiblelater/logger.py | 41 +++++++++++++++++++++--------- ansiblelater/standard.py | 5 ---- 3 files changed, 50 insertions(+), 23 deletions(-) diff --git a/ansiblelater/command/candidates.py b/ansiblelater/command/candidates.py index 1d8339a..d0ddcf7 100644 --- a/ansiblelater/command/candidates.py +++ b/ansiblelater/command/candidates.py @@ -113,6 +113,9 @@ class Candidate(object): labels = {"tag": "review", "standard": standard.name, "file": self.path, "passed": True} + if standard.id and standard.id.strip(): + labels["id"] = standard.id + for err in [err for err in result.errors if not err.lineno or utils.is_line_in_ranges(err.lineno, utils.lines_ranges(lines))]: err_labels = copy.copy(labels) @@ -122,16 +125,22 @@ class Candidate(object): if not standard.version: LOG.warn("{id}Best practice '{name}' not met:\n{path}:{error}".format( - id=standard.id, name=standard.name, path=self.path, error=err), - extra=flag_extra(err_labels)) + id=self._format_id(standard.id), + name=standard.name, + path=self.path, + error=err), extra=flag_extra(err_labels)) elif LooseVersion(standard.version) > LooseVersion(self.version): LOG.warn("{id}Future standard '{name}' not met:\n{path}:{error}".format( - id=standard.id, name=standard.name, path=self.path, error=err), - extra=flag_extra(err_labels)) + id=self._format_id(standard.id), + name=standard.name, + path=self.path, + error=err), extra=flag_extra(err_labels)) else: LOG.error("{id}Standard '{name}' not met:\n{path}:{error}".format( - id=standard.id, name=standard.name, path=self.path, error=err), - extra=flag_extra(err_labels)) + id=self._format_id(standard.id), + name=standard.name, + path=self.path, + error=err), extra=flag_extra(err_labels)) errors = errors + 1 if not result.errors: if not standard.version: @@ -143,6 +152,12 @@ class Candidate(object): return errors + def _format_id(self, standard_id): + if standard_id and standard_id.strip(): + standard_id = "[{id}] ".format(id=standard_id.strip()) + + return standard_id + def __repr__(self): # noqa return "%s (%s)" % (type(self).__name__, self.path) diff --git a/ansiblelater/logger.py b/ansiblelater/logger.py index 544cc62..9775ce7 100644 --- a/ansiblelater/logger.py +++ b/ansiblelater/logger.py @@ -25,12 +25,12 @@ def _should_do_markup(): colorama.init(autoreset=True, strip=not _should_do_markup()) -def flag_extra(kwargs): - """Ensure kwargs not conflict with the logging module.""" - assert isinstance(kwargs, dict) +def flag_extra(extra): + """Ensure extra args are prefixed.""" + assert isinstance(extra, dict) flagged = dict() - for key, value in iteritems(kwargs): + for key, value in iteritems(extra): flagged["later_" + key] = value return flagged @@ -54,6 +54,22 @@ class LogFilter(object): return logRecord.levelno <= self.__level +class MultilineFormatter(logging.Formatter): + """Logging Formatter to reset color after newline characters.""" + + def format(self, record): + record.msg = record.msg.replace("\n", "\n{}... ".format(colorama.Style.RESET_ALL)) + return logging.Formatter.format(self, record) + + +class MultilineJsonFormatter(jsonlogger.JsonFormatter): + """Logging Formatter to remove newline characters.""" + + def format(self, record): + record.msg = record.msg.replace("\n", " ") + return jsonlogger.JsonFormatter.format(self, record) + + def get_logger(name=None, level=logging.DEBUG, json=False): """ Build a logger with the given name and returns the logger. @@ -91,10 +107,10 @@ 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(CONSOLE_FORMAT))) + handler.setFormatter(MultilineFormatter(error(CONSOLE_FORMAT))) if json: - handler.setFormatter(jsonlogger.JsonFormatter(JSON_FORMAT)) + handler.setFormatter(MultilineJsonFormatter(JSON_FORMAT)) return handler @@ -103,10 +119,10 @@ 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(CONSOLE_FORMAT))) + handler.setFormatter(MultilineFormatter(warn(CONSOLE_FORMAT))) if json: - handler.setFormatter(jsonlogger.JsonFormatter(JSON_FORMAT)) + handler.setFormatter(MultilineJsonFormatter(JSON_FORMAT)) return handler @@ -115,10 +131,10 @@ 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"))) + handler.setFormatter(MultilineFormatter(info("%(message)s"))) if json: - handler.setFormatter(jsonlogger.JsonFormatter(JSON_FORMAT)) + handler.setFormatter(MultilineJsonFormatter(JSON_FORMAT)) return handler @@ -127,10 +143,10 @@ def _get_critical_handler(json=False): handler = logging.StreamHandler(sys.stderr) handler.setLevel(logging.CRITICAL) handler.addFilter(LogFilter(logging.CRITICAL)) - handler.setFormatter(logging.Formatter(critical(CONSOLE_FORMAT))) + handler.setFormatter(MultilineFormatter(critical(CONSOLE_FORMAT))) if json: - handler.setFormatter(jsonlogger.JsonFormatter(JSON_FORMAT)) + handler.setFormatter(MultilineJsonFormatter(JSON_FORMAT)) return handler @@ -164,4 +180,5 @@ def color_text(color, msg): :returns: string """ + return "{}{}{}".format(color, msg, colorama.Style.RESET_ALL) diff --git a/ansiblelater/standard.py b/ansiblelater/standard.py index 62d9efc..cc2f0ea 100644 --- a/ansiblelater/standard.py +++ b/ansiblelater/standard.py @@ -16,11 +16,6 @@ class Standard(object): :param standard_dict: Dictionary object containing all neseccary attributes """ - # if "id" not in standard_dict: - # standard_dict.update(id="") - # else: - # standard_dict.update(id="[{}] ".format(standard_dict.get("id"))) - self.id = standard_dict.get("id", "") self.name = standard_dict.get("name") self.version = standard_dict.get("version")