def setup_logging(suite, args, defaults=None): """ Configure a structuredlogger based on command line arguments. The created structuredlogger will also be set as the default logger, and can be retrieved with :py:func:`get_default_logger`. :param suite: The name of the testsuite being run :param args: A dictionary of {argument_name:value} produced from parsing the command line arguments for the application :param defaults: A dictionary of {formatter name: output stream} to apply when there is no logging supplied on the command line. If this isn't supplied, reasonable defaults are chosen (coloured mach formatting if stdout is a terminal, or raw logs otherwise). :rtype: StructuredLogger """ logger = StructuredLogger(suite) prefix = "log_" found = False found_stdout_logger = False if not hasattr(args, 'iteritems'): args = vars(args) if defaults is None: if sys.__stdout__.isatty(): defaults = {"mach": sys.stdout} else: defaults = {"raw": sys.stdout} for name, values in args.iteritems(): if name.startswith(prefix) and values is not None: for value in values: found = True if isinstance(value, str): value = log_file(value) if value == sys.stdout: found_stdout_logger = True formatter_cls = log_formatters[name[len(prefix):]][0] logger.add_handler(handlers.StreamHandler(stream=value, formatter=formatter_cls())) #If there is no user-specified logging, go with the default options if not found: for name, value in defaults.iteritems(): formatter_cls = log_formatters[name][0] logger.add_handler(handlers.StreamHandler(stream=value, formatter=formatter_cls())) elif not found_stdout_logger and sys.stdout in defaults.values(): for name, value in defaults.iteritems(): if value == sys.stdout: formatter_cls = log_formatters[name][0] logger.add_handler(handlers.StreamHandler(stream=value, formatter=formatter_cls())) set_default_logger(logger) return logger
def setup_logging(suite, args, defaults): """ Configure a structuredlogger based on command line arguments. The created structuredlogger will also be set as the default logger, and can be retrieved with :py:func:`get_default_logger`. :param suite: The name of the testsuite being run :param args: A dictionary of {argument_name:value} produced from parsing the command line arguments for the application :param defaults: A dictionary of {formatter name: output stream} to apply when there is no logging supplied on the command line. :rtype: StructuredLogger """ logger = StructuredLogger(suite) prefix = "log_" found = False found_stdout_logger = False if not hasattr(args, 'iteritems'): args = vars(args) for name, values in args.iteritems(): if name.startswith(prefix) and values is not None: for value in values: found = True if isinstance(value, str): value = log_file(value) if value == sys.stdout: found_stdout_logger = True formatter_cls = log_formatters[name[len(prefix):]][0] logger.add_handler( handlers.StreamHandler(stream=value, formatter=formatter_cls())) #If there is no user-specified logging, go with the default options if not found: for name, value in defaults.iteritems(): formatter_cls = log_formatters[name][0] logger.add_handler( handlers.StreamHandler(stream=value, formatter=formatter_cls())) elif not found_stdout_logger and sys.stdout in defaults.values(): for name, value in defaults.iteritems(): if value == sys.stdout: formatter_cls = log_formatters[name][0] logger.add_handler( handlers.StreamHandler(stream=value, formatter=formatter_cls())) set_default_logger(logger) return logger
def setup_logging(suite, args, defaults): """ Configure a structuredlogger based on command line arguments. :param suite: The name of the testsuite being run :param args: The Namespace object produced by argparse from parsing command line arguments from a parser with logging arguments. :param defaults: A dictionary of {formatter name: output stream} to apply when there is no logging supplied on the command line. :rtype: StructuredLogger """ logger = StructuredLogger(suite) prefix = "log_" found = False found_stdout_logger = False for name, value in args.iteritems(): if name.startswith(prefix) and value is not None: found = True if value == sys.stdout: found_stdout_logger = True formatter_cls = log_formatters[name[len(prefix):]][0] logger.add_handler(handlers.StreamHandler(stream=value, formatter=formatter_cls())) #If there is no user-specified logging, go with the default options if not found: for name, value in defaults.iteritems(): formatter_cls = log_formatters[name][0] logger.add_handler(handlers.StreamHandler(stream=value, formatter=formatter_cls())) elif not found_stdout_logger and sys.stdout in defaults.values(): for name, value in defaults.iteritems(): if value == sys.stdout: formatter_cls = log_formatters[name][0] logger.add_handler(handlers.StreamHandler(stream=value, formatter=formatter_cls())) return logger
def setup_logging(suite, args, defaults): """ Configure a structuredlogger based on command line arguments. :param suite: The name of the testsuite being run :param args: A dictionary of {argument_name:value} produced from parsing the command line arguments for the application :param defaults: A dictionary of {formatter name: output stream} to apply when there is no logging supplied on the command line. :rtype: StructuredLogger """ logger = StructuredLogger(suite) prefix = "log_" found = False found_stdout_logger = False for name, values in args.iteritems(): if name.startswith(prefix) and values is not None: for value in values: found = True if value == sys.stdout: found_stdout_logger = True formatter_cls = log_formatters[name[len(prefix):]][0] logger.add_handler(handlers.StreamHandler(stream=value, formatter=formatter_cls())) #If there is no user-specified logging, go with the default options if not found: for name, value in defaults.iteritems(): formatter_cls = log_formatters[name][0] logger.add_handler(handlers.StreamHandler(stream=value, formatter=formatter_cls())) elif not found_stdout_logger and sys.stdout in defaults.values(): for name, value in defaults.iteritems(): if value == sys.stdout: formatter_cls = log_formatters[name][0] logger.add_handler(handlers.StreamHandler(stream=value, formatter=formatter_cls())) return logger
def setup_logging(suite, args, defaults=None): """ Configure a structuredlogger based on command line arguments. The created structuredlogger will also be set as the default logger, and can be retrieved with :py:func:`~mozlog.structured.structuredlog.get_default_logger`. :param suite: The name of the testsuite being run :param args: A dictionary of {argument_name:value} produced from parsing the command line arguments for the application :param defaults: A dictionary of {formatter name: output stream} to apply when there is no logging supplied on the command line. If this isn't supplied, reasonable defaults are chosen (coloured mach formatting if stdout is a terminal, or raw logs otherwise). :rtype: StructuredLogger """ logger = StructuredLogger(suite) # Keep track of any options passed for formatters. formatter_options = defaultdict(lambda: formatter_option_defaults.copy()) # Keep track of formatters and list of streams specified. formatters = defaultdict(list) found = False found_stdout_logger = False if not hasattr(args, 'iteritems'): args = vars(args) if defaults is None: if sys.__stdout__.isatty(): defaults = {"mach": sys.stdout} else: defaults = {"raw": sys.stdout} for name, values in args.iteritems(): parts = name.split('_') if len(parts) > 3: continue # Our args will be ['log', <formatter>] or ['log', <formatter>, <option>]. if parts[0] == 'log' and values is not None: if len(parts) == 1 or parts[1] not in log_formatters: continue if len(parts) == 2: _, formatter = parts for value in values: found = True if isinstance(value, basestring): value = log_file(value) if value == sys.stdout: found_stdout_logger = True formatters[formatter].append(value) if len(parts) == 3: _, formatter, opt = parts formatter_options[formatter][opt] = values #If there is no user-specified logging, go with the default options if not found: for name, value in defaults.iteritems(): formatters[name].append(value) elif not found_stdout_logger and sys.stdout in defaults.values(): for name, value in defaults.iteritems(): if value == sys.stdout: formatters[name].append(value) setup_handlers(logger, formatters, formatter_options) set_default_logger(logger) return logger
def __init__(self, name=None, level=logging.NOTSET): self.structured = StructuredLogger(name) logging.Handler.__init__(self, level=level)