From 08839e144cb77f7f6e7193867ab66c59775b0b8b Mon Sep 17 00:00:00 2001
From: Walter Purcaro <vuolter@gmail.com>
Date: Thu, 14 Nov 2013 02:11:57 +0100
Subject: Coloured logging

---
 pyload/Core.py                        | 14 ++++++-
 pyload/utils/colorlog/__init__.py     |  8 ++++
 pyload/utils/colorlog/colorlog.py     | 76 +++++++++++++++++++++++++++++++++++
 pyload/utils/colorlog/escape_codes.py | 37 +++++++++++++++++
 4 files changed, 134 insertions(+), 1 deletion(-)
 create mode 100644 pyload/utils/colorlog/__init__.py
 create mode 100644 pyload/utils/colorlog/colorlog.py
 create mode 100644 pyload/utils/colorlog/escape_codes.py

(limited to 'pyload')

diff --git a/pyload/Core.py b/pyload/Core.py
index 324494500..96421d862 100644
--- a/pyload/Core.py
+++ b/pyload/Core.py
@@ -59,6 +59,8 @@ from utils.fs import free_space, exists, makedirs, join, chmod
 
 from codecs import getwriter
 
+from utils.colorlog import ColoredFormatter
+
 # test runner overwrites sys.stdout
 if hasattr(sys.stdout, "encoding"): enc = get_console_encoding(sys.stdout.encoding)
 else: enc = "utf8"
@@ -517,7 +519,17 @@ class Core(object):
         if not tfrm:
             tfrm = "%Y-%m-%d %H:%M:%S"
 
-        frm = logging.Formatter("%(asctime)s %(levelname)-8s  %(message)s", tfrm)
+        frm = ColoredFormatter(
+            format="%(asctime)s %(log_color)s%(bold)s%(black)s %(levelname)+8s %(reset)s %(message)s",
+            datefmt=tfrm,
+            log_colors={
+                'DEBUG':    'bg_cyan',
+                'INFO':     'bg_green',
+                'WARNING':  'bg_yellow',
+                'ERROR':    'bg_red',
+                'CRITICAL': 'bg_purple',
+            }
+        )
         console.setFormatter(frm)
         self.log = logging.getLogger("log") # setable in config
 
diff --git a/pyload/utils/colorlog/__init__.py b/pyload/utils/colorlog/__init__.py
new file mode 100644
index 000000000..abf5532fb
--- /dev/null
+++ b/pyload/utils/colorlog/__init__.py
@@ -0,0 +1,8 @@
+"""A logging formatter for colored output"""
+
+from __future__ import absolute_import
+
+__all__ = ['ColoredFormatter', 'default_log_colors', 'escape_codes']
+
+from colorlog.colorlog import (
+    ColoredFormatter, default_log_colors, escape_codes)
diff --git a/pyload/utils/colorlog/colorlog.py b/pyload/utils/colorlog/colorlog.py
new file mode 100644
index 000000000..5491676b8
--- /dev/null
+++ b/pyload/utils/colorlog/colorlog.py
@@ -0,0 +1,76 @@
+"""The ColoredFormatter class"""
+
+from __future__ import absolute_import
+
+import sys
+import logging
+
+from colorlog.escape_codes import escape_codes
+
+__all__ = ['escape_codes', 'default_log_colors', 'ColoredFormatter']
+
+# The default colors to use for the debug levels
+default_log_colors = {
+    'DEBUG':    'white',
+    'INFO':     'green',
+    'WARNING':  'yellow',
+    'ERROR':    'red',
+    'CRITICAL': 'bold_red',
+}
+
+
+class ColoredFormatter(logging.Formatter):
+    """A formatter that allows colors to be placed in the format string.
+
+    Intended to help in creating more readable logging output."""
+
+    def __init__(self, format, datefmt=None,
+                 log_colors=default_log_colors, reset=True, style='%'):
+        """
+        :Parameters:
+        - format (str): The format string to use
+        - datefmt (str): A format string for the date
+        - log_colors (dict):
+            A mapping of log level names to color names
+        - reset (bool):
+            Implictly append a color reset to all records unless False
+        - style ('%' or '{' or '$'):
+            The format style to use. No meaning prior to Python 3.2.
+
+        The ``format``, ``datefmt`` and ``style`` args are passed on to the
+        Formatter constructor.
+        """
+        if sys.version_info > (3, 2):
+            super(ColoredFormatter, self).__init__(
+                format, datefmt, style=style)
+        elif sys.version_info > (2, 7):
+            super(ColoredFormatter, self).__init__(format, datefmt)
+        else:
+            logging.Formatter.__init__(self, format, datefmt)
+        self.log_colors = log_colors
+        self.reset = reset
+
+    def format(self, record):
+        # Add the color codes to the record
+        record.__dict__.update(escape_codes)
+
+        # If we recognise the level name,
+        # add the levels color as `log_color`
+        if record.levelname in self.log_colors:
+            color = self.log_colors[record.levelname]
+            record.log_color = escape_codes[color]
+        else:
+            record.log_color = ""
+
+        # Format the message
+        if sys.version_info > (2, 7):
+            message = super(ColoredFormatter, self).format(record)
+        else:
+            message = logging.Formatter.format(self, record)
+
+        # Add a reset code to the end of the message
+        # (if it wasn't explicitly added in format str)
+        if self.reset and not message.endswith(escape_codes['reset']):
+            message += escape_codes['reset']
+
+        return message
diff --git a/pyload/utils/colorlog/escape_codes.py b/pyload/utils/colorlog/escape_codes.py
new file mode 100644
index 000000000..8d057e9e4
--- /dev/null
+++ b/pyload/utils/colorlog/escape_codes.py
@@ -0,0 +1,37 @@
+"""
+Generates a dictionary of ANSI escape codes
+
+http://en.wikipedia.org/wiki/ANSI_escape_code
+"""
+
+__all__ = ['escape_codes']
+
+# Returns escape codes from format codes
+esc = lambda *x: '\033[' + ';'.join(x) + 'm'
+
+# The initial list of escape codes
+escape_codes = {
+    'reset': esc('39', '49', '0'),
+    'bold': esc('01'),
+}
+
+# The color names
+colors = [
+    'black',
+    'red',
+    'green',
+    'yellow',
+    'blue',
+    'purple',
+    'cyan',
+    'white'
+]
+
+# Create foreground and background colors...
+for lcode, lname in [('3', ''), ('4', 'bg_')]:
+    # ...with the list of colors...
+    for code, name in enumerate(colors):
+        code = str(code)
+        # ...and both normal and bold versions of each color
+        escape_codes[lname + name] = esc(lcode + code)
+        escape_codes[lname + "bold_" + name] = esc(lcode + code, "01")
-- 
cgit v1.2.3