def test_format_failure(self): """ A traceback will print. """ stream = NativeStringIO() observer = make_stderr_observer(_file=stream, format="syslogd") try: raise ValueError("noooo {0}".format("!!")) except: err = Failure() event = { 'log_level': LogLevel.error, 'log_namespace': 'crossbar.test.test_logger.StdoutObserverTests', 'log_format': None, 'log_source': None, 'log_failure': err, 'log_system': 'foo', 'log_time': 1434099813.77449 } observer(event) result = stream.getvalue() self.assertIn("noooo {0}", result)
def test_basic(self): stream = NativeStringIO() observer = make_stderr_observer(_file=stream) log = make_logger(observer=observer) log.error("Hi!", log_system="foo") result = stream.getvalue() self.assertIn(u"[foo]", result)
def test_basic(self): stream = NativeStringIO() observer = make_stderr_observer(_file=stream) log = make_logger(observer=observer) log.error("Hi!", log_system="foo") result = stream.getvalue() self.assertIn("[foo]", result)
def test_output_syslogd(self): """ The syslogd output format is the system in square brackets, and the message. """ stream = NativeStringIO() observer = make_stderr_observer(_file=stream, format="syslogd") event = {'log_level': LogLevel.error, 'log_namespace': 'crossbar.test.test_logger.StdoutObserverTests', 'log_source': None, 'log_format': 'Hi there!', 'log_system': 'foo', 'log_time': 1434099813.77449} observer(event) result = stream.getvalue() self.assertEqual(result[:-1], "[foo] Hi there!")
def test_format_log_category(self): """ A log category in the event will mean the format is replaced with the format string referencing it. """ stream = NativeStringIO() observer = make_stderr_observer(_file=stream, format="syslogd") event = {'log_level': LogLevel.error, 'log_namespace': 'crossbar.test.test_logger.StdoutObserverTests', 'log_category': "DBG100", 'x': 'x~', 'y': 'z', 'z': 'a', 'log_source': None, 'log_system': 'foo', 'log_time': 1434099813.77449} observer(event) result = stream.getvalue() self.assertEqual(result[:-1], "[foo] DEBUG x~ z a")
def test_format_failure(self): """ A traceback will print. """ stream = NativeStringIO() observer = make_stderr_observer(_file=stream, format="syslogd") try: raise ValueError("noooo {0}".format("!!")) except: err = Failure() event = {'log_level': LogLevel.error, 'log_namespace': 'crossbar.test.test_logger.StdoutObserverTests', 'log_format': None, 'log_source': None, 'log_failure': err, 'log_system': 'foo', 'log_time': 1434099813.77449} observer(event) result = stream.getvalue() self.assertIn("noooo {0}", result)
def _startlog(options, reactor): """ Start the logging in a way that all the subcommands can use it. """ loglevel = getattr(options, "loglevel", "info") logformat = getattr(options, "logformat", "none") colour = getattr(options, "colour", "auto") set_global_log_level(loglevel) # The log observers (things that print to stderr, file, etc) observers = [] if getattr(options, "logtofile", False): # We want to log to a file if not options.logdir: logdir = options.cbdir else: logdir = options.logdir logfile = os.path.join(logdir, "node.log") if loglevel in ["error", "warn", "info"]: show_source = False else: show_source = True observers.append(make_logfile_observer(logfile, show_source)) else: # We want to log to stdout/stderr. if colour == "auto": if sys.__stdout__.isatty(): colour = True else: colour = False elif colour == "true": colour = True else: colour = False if loglevel == "none": # Do no logging! pass elif loglevel in ["error", "warn", "info"]: # Print info to stdout, warn+ to stderr observers.append(make_stdout_observer(show_source=False, format=logformat, colour=colour)) observers.append(make_stderr_observer(show_source=False, format=logformat, colour=colour)) elif loglevel == "debug": # Print debug+info to stdout, warn+ to stderr, with the class # source observers.append(make_stdout_observer(show_source=True, levels=(LogLevel.info, LogLevel.debug), format=logformat, colour=colour)) observers.append(make_stderr_observer(show_source=True, format=logformat, colour=colour)) elif loglevel == "trace": # Print trace+, with the class source observers.append(make_stdout_observer(show_source=True, levels=(LogLevel.info, LogLevel.debug), format=logformat, trace=True, colour=colour)) observers.append(make_stderr_observer(show_source=True, format=logformat, colour=colour)) else: assert False, "Shouldn't ever get here." for observer in observers: globalLogPublisher.addObserver(observer) # Make sure that it goes away reactor.addSystemEventTrigger('after', 'shutdown', globalLogPublisher.removeObserver, observer) # Actually start the logger. start_logging(None, loglevel)
def run_command_start(options): """ Subcommand "crossbar start". """ # do not allow to run more than one Crossbar.io instance # from the same Crossbar.io node directory # pid_data = check_is_running(options.cbdir) if pid_data: print( "Crossbar.io is already running from node directory {} (PID {}).". format(options.cbdir, pid_data['pid'])) sys.exit(1) else: fp = os.path.join(options.cbdir, _PID_FILENAME) with open(fp, 'w') as fd: argv = options.argv options_dump = vars(options) del options_dump['func'] del options_dump['argv'] pid_data = { 'pid': os.getpid(), 'argv': argv, 'options': options_dump } fd.write("{}\n".format( json.dumps(pid_data, sort_keys=False, indent=3, separators=(',', ': ')))) # we use an Autobahn utility to import the "best" available Twisted reactor # reactor = install_reactor(options.reactor, options.debug) # remove node PID file when reactor exits # def remove_pid_file(): fp = os.path.join(options.cbdir, _PID_FILENAME) if os.path.isfile(fp): os.remove(fp) reactor.addSystemEventTrigger('after', 'shutdown', remove_pid_file) # start Twisted logging # from crossbar._logging import log_publisher, make_logger from crossbar._logging import start_logging, set_global_log_level set_global_log_level(options.loglevel) log = make_logger() if options.logdir: # We want to log to a file from crossbar._logging import make_legacy_daily_logfile_observer log_publisher.addObserver( make_legacy_daily_logfile_observer(options.logdir, options.loglevel)) else: # We want to log to stdout/stderr. from crossbar._logging import make_stdout_observer from crossbar._logging import make_stderr_observer if options.loglevel == "none": # Do no logging! pass elif options.loglevel == "error": # Error: Only print errors to stderr. log_publisher.addObserver( make_stdout_observer(show_source=False, format=options.logformat)) log_publisher.addObserver( make_stderr_observer(show_source=False, format=options.logformat)) elif options.loglevel == "warn": # Print warnings+ to stderr. log_publisher.addObserver( make_stdout_observer(show_source=False, format=options.logformat)) log_publisher.addObserver( make_stderr_observer(show_source=False, format=options.logformat)) elif options.loglevel == "info": # Print info to stdout, warn+ to stderr log_publisher.addObserver( make_stdout_observer(show_source=False, format=options.logformat)) log_publisher.addObserver( make_stderr_observer(show_source=False, format=options.logformat)) elif options.loglevel == "debug": # Print debug+info to stdout, warn+ to stderr, with the class # source log_publisher.addObserver( make_stdout_observer(show_source=True, format=options.logformat)) log_publisher.addObserver( make_stderr_observer(show_source=True, format=options.logformat)) elif options.loglevel == "trace": # Print trace+, with the class source log_publisher.addObserver( make_stdout_observer(show_source=True, format=options.logformat, trace=True)) log_publisher.addObserver( make_stderr_observer(show_source=True, format=options.logformat)) else: assert False, "Shouldn't ever get here." # Actually start the logger. start_logging() for line in BANNER.splitlines(): log.info(click.style(("{:>40}").format(line), fg='yellow', bold=True)) bannerFormat = "{:>12} {:<24}" log.info( bannerFormat.format( "Version:", click.style(crossbar.__version__, fg='yellow', bold=True))) # log.info(bannerFormat.format("Python:", click.style(platform.python_implementation(), fg='yellow', bold=True))) # log.info(bannerFormat.format("Reactor:", click.style(qual(reactor.__class__).split('.')[-1], fg='yellow', bold=True))) log.info( bannerFormat.format("Started:", click.style(utcnow(), fg='yellow', bold=True))) log.info() log.info("Starting from node directory {}".format(options.cbdir)) # create and start Crossbar.io node # def start_crossbar(): from crossbar.controller.node import Node node = Node(reactor, options) d = node.start() def on_error(err): log.error("Could not start node: {error}", error=err.value) if reactor.running: reactor.stop() d.addErrback(on_error) reactor.callWhenRunning(start_crossbar) try: log.info("Entering reactor event loop...") reactor.run() except Exception: log.failure("Could not start reactor: {log_failure.value}")
def _startlog(options, reactor): """ Start the logging in a way that all the subcommands can use it. """ from twisted.logger import globalLogPublisher from txaio import start_logging, set_global_log_level loglevel = getattr(options, "loglevel", "info") logformat = getattr(options, "logformat", "none") colour = getattr(options, "colour", "auto") set_global_log_level(loglevel) # The log observers (things that print to stderr, file, etc) observers = [] if getattr(options, "logtofile", False): # We want to log to a file from crossbar._logging import make_logfile_observer if not options.logdir: logdir = options.cbdir else: logdir = options.logdir logfile = os.path.join(logdir, "node.log") if loglevel in ["error", "warn", "info"]: show_source = False else: show_source = True observers.append(make_logfile_observer(logfile, show_source)) else: # We want to log to stdout/stderr. from crossbar._logging import make_stdout_observer from crossbar._logging import make_stderr_observer from crossbar._logging import LogLevel if colour == "auto": if sys.__stdout__.isatty(): colour = True else: colour = False elif colour == "true": colour = True else: colour = False if loglevel == "none": # Do no logging! pass elif loglevel in ["error", "warn", "info"]: # Print info to stdout, warn+ to stderr observers.append(make_stdout_observer(show_source=False, format=logformat, colour=colour)) observers.append(make_stderr_observer(show_source=False, format=logformat, colour=colour)) elif loglevel == "debug": # Print debug+info to stdout, warn+ to stderr, with the class # source observers.append(make_stdout_observer(show_source=True, levels=(LogLevel.info, LogLevel.debug), format=logformat, colour=colour)) observers.append(make_stderr_observer(show_source=True, format=logformat, colour=colour)) elif loglevel == "trace": # Print trace+, with the class source observers.append(make_stdout_observer(show_source=True, levels=(LogLevel.info, LogLevel.debug), format=logformat, trace=True, colour=colour)) observers.append(make_stderr_observer(show_source=True, format=logformat, colour=colour)) else: assert False, "Shouldn't ever get here." for observer in observers: globalLogPublisher.addObserver(observer) # Make sure that it goes away reactor.addSystemEventTrigger('after', 'shutdown', globalLogPublisher.removeObserver, observer) # Actually start the logger. start_logging(None, loglevel)
def run_command_start(options): """ Subcommand "crossbar start". """ # do not allow to run more than one Crossbar.io instance # from the same Crossbar.io node directory # pid_data = check_is_running(options.cbdir) if pid_data: print("Crossbar.io is already running from node directory {} (PID {}).".format(options.cbdir, pid_data['pid'])) sys.exit(1) else: fp = os.path.join(options.cbdir, _PID_FILENAME) with open(fp, 'w') as fd: argv = options.argv options_dump = vars(options) del options_dump['func'] del options_dump['argv'] pid_data = { 'pid': os.getpid(), 'argv': argv, 'options': options_dump } fd.write("{}\n".format(json.dumps(pid_data, sort_keys=False, indent=3, separators=(',', ': ')))) # we use an Autobahn utility to import the "best" available Twisted reactor # reactor = install_reactor(options.reactor, options.debug) # remove node PID file when reactor exits # def remove_pid_file(): fp = os.path.join(options.cbdir, _PID_FILENAME) if os.path.isfile(fp): os.remove(fp) reactor.addSystemEventTrigger('after', 'shutdown', remove_pid_file) # start Twisted logging # from crossbar._logging import log_publisher, make_logger from crossbar._logging import start_logging, set_global_log_level set_global_log_level(options.loglevel) log = make_logger() if options.logdir: # We want to log to a file from crossbar._logging import make_legacy_daily_logfile_observer log_publisher.addObserver( make_legacy_daily_logfile_observer(options.logdir, options.loglevel)) else: # We want to log to stdout/stderr. from crossbar._logging import make_stdout_observer from crossbar._logging import make_stderr_observer if options.loglevel == "none": # Do no logging! pass elif options.loglevel == "error": # Error: Only print errors to stderr. log_publisher.addObserver(make_stdout_observer(show_source=False, format=options.logformat)) log_publisher.addObserver(make_stderr_observer(show_source=False, format=options.logformat)) elif options.loglevel == "warn": # Print warnings+ to stderr. log_publisher.addObserver(make_stdout_observer(show_source=False, format=options.logformat)) log_publisher.addObserver(make_stderr_observer(show_source=False, format=options.logformat)) elif options.loglevel == "info": # Print info to stdout, warn+ to stderr log_publisher.addObserver(make_stdout_observer(show_source=False, format=options.logformat)) log_publisher.addObserver(make_stderr_observer(show_source=False, format=options.logformat)) elif options.loglevel == "debug": # Print debug+info to stdout, warn+ to stderr, with the class # source log_publisher.addObserver(make_stdout_observer(show_source=True, format=options.logformat)) log_publisher.addObserver(make_stderr_observer(show_source=True, format=options.logformat)) elif options.loglevel == "trace": # Print trace+, with the class source log_publisher.addObserver(make_stdout_observer(show_source=True, format=options.logformat, trace=True)) log_publisher.addObserver(make_stderr_observer(show_source=True, format=options.logformat)) else: assert False, "Shouldn't ever get here." # Actually start the logger. start_logging() for line in BANNER.splitlines(): log.info(click.style(("{:>40}").format(line), fg='yellow', bold=True)) bannerFormat = "{:>12} {:<24}" log.info(bannerFormat.format("Version:", click.style(crossbar.__version__, fg='yellow', bold=True))) # log.info(bannerFormat.format("Python:", click.style(platform.python_implementation(), fg='yellow', bold=True))) # log.info(bannerFormat.format("Reactor:", click.style(qual(reactor.__class__).split('.')[-1], fg='yellow', bold=True))) log.info(bannerFormat.format("Started:", click.style(utcnow(), fg='yellow', bold=True))) log.info() log.info("Starting from node directory {}".format(options.cbdir)) # create and start Crossbar.io node # def start_crossbar(): from crossbar.controller.node import Node node = Node(reactor, options) d = node.start() def on_error(err): log.error("Could not start node: {error}", error=err.value) if reactor.running: reactor.stop() d.addErrback(on_error) reactor.callWhenRunning(start_crossbar) try: log.info("Entering reactor event loop...") reactor.run() except Exception: log.failure("Could not start reactor: {log_failure.value}")
def _startlog(options): """ Start the logging in a way that all the subcommands can use it. """ from crossbar._logging import log_publisher, start_logging from crossbar._logging import set_global_log_level loglevel = getattr(options, "loglevel", "info") logformat = getattr(options, "logformat", "none") set_global_log_level(loglevel) if getattr(options, "logtofile", False): # We want to log to a file from crossbar._logging import make_logfile_observer if not options.logdir: logdir = options.cbdir else: logdir = options.logdir logfile = os.path.join(logdir, "node.log") if loglevel in ["error", "warn", "info"]: show_source = False else: show_source = True log_publisher.addObserver(make_logfile_observer(logfile, show_source)) else: # We want to log to stdout/stderr. from crossbar._logging import make_stdout_observer from crossbar._logging import make_stderr_observer if loglevel == "none": # Do no logging! pass elif loglevel in ["error", "warn", "info"]: # Print info to stdout, warn+ to stderr log_publisher.addObserver(make_stdout_observer(show_source=False, format=logformat)) log_publisher.addObserver(make_stderr_observer(show_source=False, format=logformat)) elif loglevel == "debug": # Print debug+info to stdout, warn+ to stderr, with the class # source log_publisher.addObserver(make_stdout_observer(show_source=True, format=logformat)) log_publisher.addObserver(make_stderr_observer(show_source=True, format=logformat)) elif loglevel == "trace": # Print trace+, with the class source log_publisher.addObserver(make_stdout_observer(show_source=True, format=logformat, trace=True)) log_publisher.addObserver(make_stderr_observer(show_source=True, format=logformat)) else: assert False, "Shouldn't ever get here." # Actually start the logger. start_logging()