diff options
| author | 2013-11-17 14:07:47 +0100 | |
|---|---|---|
| committer | 2013-11-17 14:07:47 +0100 | |
| commit | 02282573d6ba32e164044daab192eb7b5cb14046 (patch) | |
| tree | 9a761ff2891cda0d76bc5be54a03344163ecb088 /pyload | |
| parent | refactored pluginManager (diff) | |
| parent | Applied RaNaN advice (diff) | |
| download | pyload-02282573d6ba32e164044daab192eb7b5cb14046.tar.xz | |
Merge pull request #379 from vuolter/m/c_logging
Coloured CLI
Diffstat (limited to 'pyload')
| -rw-r--r-- | pyload/Core.py | 46 | ||||
| -rw-r--r-- | pyload/config/default.py | 1 | ||||
| -rw-r--r-- | pyload/lib/colorlog/__init__.py | 8 | ||||
| -rw-r--r-- | pyload/lib/colorlog/colorlog.py | 76 | ||||
| -rw-r--r-- | pyload/lib/colorlog/escape_codes.py | 37 | 
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") | 
