From 8400509f1cdfd8fad5dc3d16543b934c9e5751b6 Mon Sep 17 00:00:00 2001 From: Yves Bastide Date: Wed, 23 Nov 2016 14:44:24 +0100 Subject: [PATCH 1/2] Logging: add exception information Issue #162 Just cut and pasted from logging.py. Signed-off-by: Yves Bastide --- simpleflow/settings/logging_formatter.py | 25 +++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/simpleflow/settings/logging_formatter.py b/simpleflow/settings/logging_formatter.py index f72a83c5f..f4480bbb8 100644 --- a/simpleflow/settings/logging_formatter.py +++ b/simpleflow/settings/logging_formatter.py @@ -60,4 +60,27 @@ def format(self, record): record.isodate = date.isoformat() record.message = record.msg % record.args record.coloredlevel = colorize(record.levelname, record.levelname) - return "%(isodate)s %(coloredlevel)s [process=%(processName)s, pid=%(process)s]: %(message)s" % record.__dict__ + s = "%(isodate)s %(coloredlevel)s [process=%(processName)s, pid=%(process)s]: %(message)s" % record.__dict__ + + # C&P from logging.Formatter#format + if record.exc_info: + # Cache the traceback text to avoid converting it multiple times + # (it's constant anyway) + if not record.exc_text: + record.exc_text = self.formatException(record.exc_info) + if record.exc_text: + if s[-1:] != "\n": + s = s + "\n" + try: + s = s + record.exc_text + except UnicodeError: + # Sometimes filenames have non-ASCII chars, which can lead + # to errors when s is Unicode and record.exc_text is str + # See issue 8924. + # We also use replace for when there are multiple + # encodings, e.g. UTF-8 for the filesystem and latin-1 + # for a script. See issue 13232. + s = s + record.exc_text.decode(sys.getfilesystemencoding(), + 'replace') + + return s From 2b5c22085cf34e89eeeb1c66061b1eea303d27e9 Mon Sep 17 00:00:00 2001 From: Yves Bastide Date: Thu, 9 Feb 2017 22:07:24 +0100 Subject: [PATCH 2/2] Add --color global option Signed-off-by: Yves Bastide --- simpleflow/command.py | 7 ++++++- simpleflow/settings/logging_formatter.py | 10 +++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/simpleflow/command.py b/simpleflow/command.py index aa4a81cc9..7d5d34555 100644 --- a/simpleflow/command.py +++ b/simpleflow/command.py @@ -18,6 +18,8 @@ import swf.querysets from simpleflow.history import History +from simpleflow.settings import logging_formatter +from simpleflow.settings.logging_formatter import ColorModes from simpleflow.swf.stats import pretty from simpleflow.swf import helpers from simpleflow.swf.process import decider @@ -76,11 +78,14 @@ def comma_separated_list(value): @click.group() @click.option('--format') @click.option('--header/--no-header', default=False) +@click.option('--color', type=click.Choice([ColorModes.AUTO, ColorModes.ALWAYS, ColorModes.NEVER]), + default=ColorModes.AUTO) @click.version_option(version=__version__) @click.pass_context -def cli(ctx, header, format): +def cli(ctx, header, format, color): ctx.params['format'] = format ctx.params['header'] = header + logging_formatter.color_mode = color def get_workflow_type(domain_name, workflow_class): diff --git a/simpleflow/settings/logging_formatter.py b/simpleflow/settings/logging_formatter.py index f4480bbb8..258201e2c 100644 --- a/simpleflow/settings/logging_formatter.py +++ b/simpleflow/settings/logging_formatter.py @@ -10,9 +10,17 @@ END = '\033[0m' +class ColorModes(object): + AUTO = 'auto' + ALWAYS = 'always' + NEVER = 'never' + +color_mode = 'auto' + + def colorize(level, message): # if not in a tty, we're likely redirected or piped - if not sys.stdout.isatty(): + if color_mode == ColorModes.NEVER or (color_mode == ColorModes.AUTO and not sys.stdout.isatty()): return message # color mappings