aboutsummaryrefslogtreecommitdiffstats
path: root/pylog/onaplogging/colorFormatter.py
diff options
context:
space:
mode:
Diffstat (limited to 'pylog/onaplogging/colorFormatter.py')
-rw-r--r--pylog/onaplogging/colorFormatter.py143
1 files changed, 143 insertions, 0 deletions
diff --git a/pylog/onaplogging/colorFormatter.py b/pylog/onaplogging/colorFormatter.py
new file mode 100644
index 0000000..a60e441
--- /dev/null
+++ b/pylog/onaplogging/colorFormatter.py
@@ -0,0 +1,143 @@
+# Copyright 2018 ke liang <lokyse@163.com>.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import os
+import sys
+import logging
+from logging import Formatter
+
+
+ATTRIBUTES = {
+ 'normal': 0,
+ 'bold': 1,
+ 'underline': 4,
+ 'blink': 5,
+ 'invert': 7,
+ 'hide': 8,
+
+}
+
+
+HIGHLIGHTS = {
+
+ 'black': 40,
+ 'red': 41,
+ 'green': 42,
+ 'yellow': 43,
+ 'blue': 44,
+ 'purple': 45,
+ 'cyan': 46,
+ 'white': 47,
+}
+
+COLORS = {
+
+ 'black': 30,
+ 'red': 31,
+ 'green': 32,
+ 'yellow': 33,
+ 'blue': 34,
+ 'purple': 35,
+ 'cyan': 36,
+ 'white': 37,
+}
+
+COLOR_TAG = "color"
+HIGHLIGHT_TAG = "highlight"
+ATTRIBUTE_TAG = "attribute"
+
+RESET = '\033[0m'
+
+
+def colored(text, color=None, on_color=None, attrs=None):
+ # It can't support windows system cmd right now!
+ # TODO: colered output on windows system cmd
+ if os.name in ('nt', 'ce'):
+ return text
+
+ if isinstance(attrs, str):
+ attrs = [attrs]
+
+ if os.getenv('ANSI_COLORS_DISABLED', None) is None:
+ fmt_str = '\033[%dm%s'
+ if color is not None and isinstance(color, str):
+ text = fmt_str % (COLORS.get(color, 0), text)
+
+ if on_color is not None and isinstance(on_color, str):
+ text = fmt_str % (HIGHLIGHTS.get(on_color, 0), text)
+
+ if attrs is not None:
+ for attr in attrs:
+ text = fmt_str % (ATTRIBUTES.get(attr, 0), text)
+
+ # keep origin color for tail spaces
+ text += RESET
+ return text
+
+
+class BaseColorFormatter(Formatter):
+
+ def __init__(self, fmt=None, datefmt=None, colorfmt=None, style="%"):
+ if sys.version_info > (3, 2):
+ super(BaseColorFormatter, self).__init__(
+ fmt=fmt, datefmt=datefmt, style=style)
+ elif sys.version_info > (2, 7):
+ super(BaseColorFormatter, self).__init__(fmt, datefmt)
+ else:
+ Formatter.__init__(self, fmt, datefmt)
+
+ self.style = style
+ if sys.version_info > (3, 2):
+ if self.style not in logging._STYLES:
+ raise ValueError('Style must be one of: %s' % ','.join(
+ logging._STYLES.keys()))
+
+ self.colorfmt = colorfmt
+
+ print(self.colorfmt, isinstance(self.colorfmt, dict))
+
+ def _parseColor(self, record):
+ """
+ color formatter for instance:
+ {
+ "logging-levelname":
+ {
+ "color":"<COLORS>",
+ "highlight":"<HIGHLIGHTS>",
+ "attribute":"<ATTRIBUTES>",
+ }
+ }
+ :param record:
+ :return: text color, background color, text attribute
+ """
+ if self.colorfmt and isinstance(self.colorfmt, dict):
+
+ level = record.levelname
+ colors = self.colorfmt.get(level, None)
+
+ if colors is not None and isinstance(colors, dict):
+ return colors.get(COLOR_TAG, None), \
+ colors.get(HIGHLIGHT_TAG, None), \
+ colors.get(ATTRIBUTE_TAG, None)
+
+ return None, None, None
+
+ def format(self, record):
+
+ if sys.version_info > (2, 7):
+ s = super(BaseColorFormatter, self).format(record)
+ else:
+ s = Formatter.format(self, record)
+ color, on_color, attribute = self._parseColor(record)
+ return colored(s, color, on_color, attrs=attribute)