From 17ce41cc0dbd959599a98b4649d64b38ddaa05bf Mon Sep 17 00:00:00 2001 From: GilbN <24592972+GilbN@users.noreply.github.com> Date: Mon, 10 Apr 2023 23:36:19 +0200 Subject: [PATCH] Add ansi colors to python logs --- ci/logger.py | 30 ++++++++++++++++++++++++++++++ ci/template.html | 25 ++++++++++++++++++++----- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/ci/logger.py b/ci/logger.py index 70ff5a6..0fb334f 100644 --- a/ci/logger.py +++ b/ci/logger.py @@ -3,6 +3,7 @@ import os import logging from logging.handlers import TimedRotatingFileHandler +from logging import LogRecord import re import platform @@ -17,6 +18,33 @@ else: logger = logging.getLogger() +class ColorPercentStyle(logging.PercentStyle): + """Custom log formatter that add color to specific log levels.""" + grey = "38" + blue = "34" + yellow = "33" + red = "31" + cyan = "36" + + def _get_color_fmt(self, color_code, bold=False): + if bold: + return "\x1b[" + color_code + ";1m" + self._fmt + "\x1b[0m" + return "\x1b[" + color_code + ";20m" + self._fmt + "\x1b[0m" + + def _get_fmt(self, levelno): + colors = { + logging.DEBUG: self._get_color_fmt(self.grey), + logging.INFO: self._get_color_fmt(self.cyan), + logging.WARNING: self._get_color_fmt(self.yellow), + logging.ERROR: self._get_color_fmt(self.red), + logging.CRITICAL: self._get_color_fmt(self.red) + } + + return colors.get(levelno, self._get_color_fmt(self.grey)) + + def _format(self, record:LogRecord): + return self._get_fmt(record.levelno) % record.__dict__ + class CustomLogFormatter(logging.Formatter): """Formatter that removes creds from logs.""" ACCESS_KEY = os.environ.get("ACCESS_KEY","super_secret_key") @@ -42,6 +70,8 @@ class CustomLogFormatter(logging.Formatter): return s + def formatMessage(self, record): + return ColorPercentStyle(self._fmt).format(record) def configure_logging(log_level:str): """Setup console and file logging""" diff --git a/ci/template.html b/ci/template.html index 140be7a..75c6d84 100644 --- a/ci/template.html +++ b/ci/template.html @@ -99,10 +99,15 @@ strong { color: rgba(218, 59, 138); } + .warning-note { + color: #96a2b4; + } + + .log-debug {color:lightgray} + .log-info {color:lightskyblue} + .log-warning {color:darkorange} + .log-error {color:red} } - .warning-note { - color: #96a2b4; - } @media (prefers-color-scheme: light) { body { @@ -174,6 +179,11 @@ border-bottom: 1px solid #dcdcdc; background: #f5f5f5; } + + .log-debug {color:#9bb0bf} + .log-info {color:#60707c} + .log-warning {color:darkorange} + .log-error {color:red} } body, @@ -577,8 +587,13 @@ fetch("ci.log") .then(response => response.text()) .then(logs => { - document.getElementById("logs").innerText = logs - }) + pylogs = logs.replace(/\[38;20m/gi,"" + ).replace(/\[33;20m/gi,"" + ).replace(/\[31;20m/gi,"" + ).replace(/\[36;20m/gi,"" + ).replace(/\[0m/gi,"") + document.getElementById("logs").innerHTML = pylogs + })