| OLD | NEW |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import contextlib | 5 import contextlib |
| 6 import logging | 6 import logging |
| 7 import os | 7 import os |
| 8 import sys | 8 import sys |
| 9 | 9 |
| 10 from pylib import constants | 10 from pylib import constants |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 """ | 29 """ |
| 30 # pylint does not see members added dynamically in the constructor. | 30 # pylint does not see members added dynamically in the constructor. |
| 31 # pylint: disable=no-member | 31 # pylint: disable=no-member |
| 32 color_map = { | 32 color_map = { |
| 33 logging.DEBUG: colorama.Fore.CYAN, | 33 logging.DEBUG: colorama.Fore.CYAN, |
| 34 logging.WARNING: colorama.Fore.YELLOW, | 34 logging.WARNING: colorama.Fore.YELLOW, |
| 35 logging.ERROR: colorama.Fore.RED, | 35 logging.ERROR: colorama.Fore.RED, |
| 36 logging.CRITICAL: colorama.Back.RED + colorama.Style.BRIGHT, | 36 logging.CRITICAL: colorama.Back.RED + colorama.Style.BRIGHT, |
| 37 } | 37 } |
| 38 | 38 |
| 39 def __init__(self, force_color=False): |
| 40 super(ColorStreamHandler, self).__init__() |
| 41 self.force_color = force_color |
| 42 |
| 39 @property | 43 @property |
| 40 def is_tty(self): | 44 def is_tty(self): |
| 41 isatty = getattr(self.stream, 'isatty', None) | 45 isatty = getattr(self.stream, 'isatty', None) |
| 42 return isatty and isatty() | 46 return isatty and isatty() |
| 43 | 47 |
| 44 #override | 48 #override |
| 45 def format(self, record): | 49 def format(self, record): |
| 46 message = logging.StreamHandler.format(self, record) | 50 message = logging.StreamHandler.format(self, record) |
| 47 if self.is_tty: | 51 if self.force_color or self.is_tty: |
| 48 return self.Colorize(message, record.levelno) | 52 return self.Colorize(message, record.levelno) |
| 53 return message |
| 49 | 54 |
| 50 def Colorize(self, message, log_level): | 55 def Colorize(self, message, log_level): |
| 51 try: | 56 try: |
| 52 return self.color_map[log_level] + message + colorama.Style.RESET_ALL | 57 return self.color_map[log_level] + message + colorama.Style.RESET_ALL |
| 53 except KeyError: | 58 except KeyError: |
| 54 return message | 59 return message |
| 55 | 60 |
| 56 @staticmethod | 61 @staticmethod |
| 57 def MakeDefault(): | 62 def MakeDefault(force_color=False): |
| 58 """ | 63 """ |
| 59 Replaces the default logging handlers with a coloring handler. To use | 64 Replaces the default logging handlers with a coloring handler. To use |
| 60 a colorizing handler at the same time as others, either register them | 65 a colorizing handler at the same time as others, either register them |
| 61 after this call, or add the ColorStreamHandler on the logger using | 66 after this call, or add the ColorStreamHandler on the logger using |
| 62 Logger.addHandler() | 67 Logger.addHandler() |
| 68 |
| 69 Args: |
| 70 force_color: Set to True to bypass the tty check and always colorize. |
| 63 """ | 71 """ |
| 64 # If the existing handlers aren't removed, messages are duplicated | 72 # If the existing handlers aren't removed, messages are duplicated |
| 65 logging.getLogger().handlers = [] | 73 logging.getLogger().handlers = [] |
| 66 logging.getLogger().addHandler(ColorStreamHandler()) | 74 logging.getLogger().addHandler(ColorStreamHandler(force_color)) |
| 67 | 75 |
| 68 | 76 |
| 69 @contextlib.contextmanager | 77 @contextlib.contextmanager |
| 70 def SuppressLogging(level=logging.ERROR): | 78 def SuppressLogging(level=logging.ERROR): |
| 71 """Momentarilly suppress logging events from all loggers. | 79 """Momentarilly suppress logging events from all loggers. |
| 72 | 80 |
| 73 TODO(jbudorick): This is not thread safe. Log events from other threads might | 81 TODO(jbudorick): This is not thread safe. Log events from other threads might |
| 74 also inadvertently dissapear. | 82 also inadvertently dissapear. |
| 75 | 83 |
| 76 Example: | 84 Example: |
| 77 | 85 |
| 78 with logging_utils.SuppressLogging(): | 86 with logging_utils.SuppressLogging(): |
| 79 # all but CRITICAL logging messages are suppressed | 87 # all but CRITICAL logging messages are suppressed |
| 80 logging.info('just doing some thing') # not shown | 88 logging.info('just doing some thing') # not shown |
| 81 logging.critical('something really bad happened') # still shown | 89 logging.critical('something really bad happened') # still shown |
| 82 | 90 |
| 83 Args: | 91 Args: |
| 84 level: logging events with this or lower levels are suppressed. | 92 level: logging events with this or lower levels are suppressed. |
| 85 """ | 93 """ |
| 86 logging.disable(level) | 94 logging.disable(level) |
| 87 yield | 95 yield |
| 88 logging.disable(logging.NOTSET) | 96 logging.disable(logging.NOTSET) |
| OLD | NEW |