123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- import logging
- import os
- import sys
- import colorama
- def to_bool(arg):
- '''
- Return a boolean value based on `arg`.
- '''
- if arg is None or isinstance(arg, bool):
- return arg
- if isinstance(arg, str):
- arg = arg.lower()
- if arg in ('yes', 'on', '1', 'true', 1):
- return True
- return False
- def interactive_console():
- '''
- Return whether the current console is "interactive". Meaning: Capable of
- user input and not just something like a cron job.
- '''
- return sys.stdout.isatty() and os.environ.get('TERM') != 'dumb'
- def should_do_markup(no_color, configs):
- '''
- Given the value of the command-line no-color argument, and a dict of configuration filename to
- corresponding parsed configuration, determine if we should enable colorama marking up.
- '''
- if no_color:
- return False
- if any(config.get('output', {}).get('color') is False for config in configs.values()):
- return False
- py_colors = os.environ.get('PY_COLORS', None)
- if py_colors is not None:
- return to_bool(py_colors)
- return interactive_console()
- LOG_LEVEL_TO_COLOR = {
- logging.CRITICAL: colorama.Fore.RED,
- logging.ERROR: colorama.Fore.RED,
- logging.WARN: colorama.Fore.YELLOW,
- logging.INFO: colorama.Fore.GREEN,
- logging.DEBUG: colorama.Fore.CYAN,
- }
- class Console_color_formatter(logging.Formatter):
- def format(self, record):
- color = LOG_LEVEL_TO_COLOR.get(record.levelno)
- return color_text(color, record.msg)
- def color_text(color, message):
- '''
- Give colored text.
- '''
- if not color:
- return message
- return '{}{}{}'.format(color, message, colorama.Style.RESET_ALL)
- def configure_logging(console_log_level, syslog_log_level=None):
- '''
- Configure logging to go to both the console and syslog. Use the given log levels, respectively.
- '''
- if syslog_log_level is None:
- syslog_log_level = console_log_level
- console_handler = logging.StreamHandler()
- console_handler.setFormatter(Console_color_formatter())
- console_handler.setLevel(console_log_level)
- syslog_path = None
- if os.path.exists('/dev/log'):
- syslog_path = '/dev/log'
- elif os.path.exists('/var/run/syslog'):
- syslog_path = '/var/run/syslog'
- if syslog_path and not interactive_console():
- syslog_handler = logging.handlers.SysLogHandler(address=syslog_path)
- syslog_handler.setFormatter(logging.Formatter('borgmatic: %(levelname)s %(message)s'))
- syslog_handler.setLevel(syslog_log_level)
- handlers = (console_handler, syslog_handler)
- else:
- handlers = (console_handler,)
- logging.basicConfig(level=min(console_log_level, syslog_log_level), handlers=handlers)
|