summaryrefslogtreecommitdiffstats
path: root/pyload
diff options
context:
space:
mode:
authorGravatar RaNaN <Mast3rRaNaN@hotmail.de> 2013-11-17 14:07:47 +0100
committerGravatar RaNaN <Mast3rRaNaN@hotmail.de> 2013-11-17 14:07:47 +0100
commit02282573d6ba32e164044daab192eb7b5cb14046 (patch)
tree9a761ff2891cda0d76bc5be54a03344163ecb088 /pyload
parentrefactored pluginManager (diff)
parentApplied RaNaN advice (diff)
downloadpyload-02282573d6ba32e164044daab192eb7b5cb14046.tar.xz
Merge pull request #379 from vuolter/m/c_logging
Coloured CLI
Diffstat (limited to 'pyload')
-rw-r--r--pyload/Core.py46
-rw-r--r--pyload/config/default.py1
-rw-r--r--pyload/lib/colorlog/__init__.py8
-rw-r--r--pyload/lib/colorlog/colorlog.py76
-rw-r--r--pyload/lib/colorlog/escape_codes.py37
5 files changed, 161 insertions, 7 deletions
diff --git a/pyload/Core.py b/pyload/Core.py
index 324494500..8897764a7 100644
--- a/pyload/Core.py
+++ b/pyload/Core.py
@@ -501,7 +501,7 @@ class Core(object):
console = logging.StreamHandler(sys.stdout)
# try to get a time formatting depending on system locale
- tfrm = None
+ datefmt = None
try: # change current locale to default if it is not set
current_locale = locale.getlocale()
if current_locale == (None, None):
@@ -509,16 +509,47 @@ class Core(object):
# We use timeformat provided by locale when available
if current_locale != (None, None):
- tfrm = locale.nl_langinfo(locale.D_FMT) + " " + locale.nl_langinfo(locale.T_FMT)
+ datefmt = locale.nl_langinfo(locale.D_FMT) + " " + locale.nl_langinfo(locale.T_FMT)
except: # something did go wrong, locale is heavily platform dependant
pass
# default formatting when no one was obtained (ex.: 2013-10-22 18:27:46)
- if not tfrm:
- tfrm = "%Y-%m-%d %H:%M:%S"
+ if not datefmt:
+ datefmt = "%Y-%m-%d %H:%M:%S"
+
+ # file handler formatter
+ fhfmt = "%(asctime)s %(levelname)-8s %(message)s"
+ fh_frm = logging.Formatter(fhfmt, datefmt)
+
+ # console formatter
+ if self.config['log']['console_color'] == "No":
+ console_frm = fh_frm
+ else:
+ from lib.colorlog import ColoredFormatter
+
+ if self.config['log']['console_color'] == "Light":
+ cfmt = "%(asctime)s %(log_color)s%(bold)s%(white)s %(levelname)+8s %(reset)s %(message)s"
+ clr = {
+ 'DEBUG': 'bg_cyan',
+ 'INFO': 'bg_green',
+ 'WARNING': 'bg_yellow',
+ 'ERROR': 'bg_red',
+ 'CRITICAL': 'bg_purple',
+ }
+ elif self.config['log']['console_color'] == "Full":
+ cfmt = "%(asctime)s %(log_color)s[%(levelname)-8s] %(message)s"
+ clr = {
+ 'DEBUG': 'cyan',
+ 'INFO': 'green',
+ 'WARNING': 'yellow',
+ 'ERROR': 'red',
+ 'CRITICAL': 'purple',
+ }
+ console_frm = ColoredFormatter(cfmt, datefmt, clr)
+
+ #: set console formatter
+ console.setFormatter(console_frm)
- frm = logging.Formatter("%(asctime)s %(levelname)-8s %(message)s", tfrm)
- console.setFormatter(frm)
self.log = logging.getLogger("log") # setable in config
if not exists(self.config['log']['log_folder']):
@@ -533,7 +564,8 @@ class Core(object):
else:
file_handler = logging.FileHandler(join(self.config['log']['log_folder'], 'log.txt'), encoding="utf8")
- file_handler.setFormatter(frm)
+ #: set file handler formatter
+ file_handler.setFormatter(fh_frm)
self.log.addHandler(file_handler)
self.log.addHandler(console) #if console logging
diff --git a/pyload/config/default.py b/pyload/config/default.py
index 0ae1a2649..8e2dcae74 100644
--- a/pyload/config/default.py
+++ b/pyload/config/default.py
@@ -25,6 +25,7 @@ def make_config(config):
("file_log", "bool", _("File Log"), True),
("log_count", "int", _("Count"), 5),
("log_rotate", "bool", _("Log Rotate"), True),
+ ("console_color", "No;Light;Full", _("Colorize Console"), "Light"),
])
config.addConfigSection("permission", _("Permissions"), _("Description"), _("Long description"),
diff --git a/pyload/lib/colorlog/__init__.py b/pyload/lib/colorlog/__init__.py
new file mode 100644
index 000000000..abf5532fb
--- /dev/null
+++ b/pyload/lib/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/lib/colorlog/colorlog.py b/pyload/lib/colorlog/colorlog.py
new file mode 100644
index 000000000..5491676b8
--- /dev/null
+++ b/pyload/lib/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/lib/colorlog/escape_codes.py b/pyload/lib/colorlog/escape_codes.py
new file mode 100644
index 000000000..8d057e9e4
--- /dev/null
+++ b/pyload/lib/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")