def reconfigServiceWithBuildbotConfig(self, new_config): if new_config.mq.get('type', 'simple') != "wamp": return wamp = new_config.mq log.msg("Starting wamp with config: %r", wamp) router_url = wamp.get('router_url', None) # This is not a good idea to allow people to switch the router via reconfig # how would we continue the current transactions ? # how would we tell the workers to switch router ? if self.app is not None and self.router_url != router_url: raise ValueError( "Cannot use different wamp router url when reconfiguring") if router_url is None: return self.router_url = router_url self.app = self.serviceClass( url=self.router_url, extra=dict(master=self.master, parent=self), realm=ascii2unicode(wamp.get('realm', 'buildbot')), make=make ) wamp_debug_level = wamp.get('wamp_debug_level', 'error') txaio.set_global_log_level(wamp_debug_level) yield self.app.setServiceParent(self) yield service.ReconfigurableServiceMixin.reconfigServiceWithBuildbotConfig(self, new_config)
def reconfigServiceWithBuildbotConfig(self, new_config): if new_config.mq.get('type', 'simple') != "wamp": return wamp = new_config.mq log.msg("Starting wamp with config: %r", wamp) router_url = wamp.get('router_url', None) # This is not a good idea to allow people to switch the router via reconfig # how would we continue the current transactions ? # how would we tell the workers to switch router ? if self.app is not None and self.router_url != router_url: raise ValueError( "Cannot use different wamp router url when reconfiguring") if router_url is None: return self.router_url = router_url self.app = self.serviceClass(url=self.router_url, extra=dict(master=self.master, parent=self), realm=ascii2unicode( wamp.get('realm', 'buildbot')), make=make) wamp_debug_level = wamp.get('wamp_debug_level', 'error') txaio.set_global_log_level(wamp_debug_level) yield self.app.setServiceParent(self) yield service.ReconfigurableServiceMixin.reconfigServiceWithBuildbotConfig( self, new_config)
def test_set_global_changes_loggers(self): """ Setting the global log level changes the level of all loggers that were not instantiated with a level. """ log = make_logger() self.assertEqual(log._log_level, "info") set_global_log_level("warn") self.assertEqual(log._log_level, "warn")
def test_set_global_does_not_change_explicit_loggers(self): """ Setting the global log level does not change loggers that have an explicit level set. """ log = make_logger("info") self.assertEqual(log._log_level, "info") set_global_log_level("warn") self.assertEqual(log._log_level, "info")
def test_trace(handler, framework): logger = txaio.make_logger() old_log = txaio.get_global_log_level() txaio.set_global_log_level("trace") # the txaio_trace variable should be in it logger.trace("trace {txaio_trace}", ) txaio.set_global_log_level(old_log) assert len(handler.messages) == 1 assert handler.messages[0].endswith(b"trace True")
def test_emit_noop(handler, framework): """ emit() with a too-low level is an no-op. """ logger = txaio.make_logger() old_log = txaio.get_global_log_level() txaio.set_global_log_level("info") logger.emit("debug", "foobar") txaio.set_global_log_level(old_log) assert len(handler.messages) == 0
def test_trace(handler, framework): logger = txaio.make_logger() old_log = txaio.get_global_log_level() txaio.set_global_log_level("trace") # the txaio_trace variable should be in it logger.trace( "trace {txaio_trace}", ) txaio.set_global_log_level(old_log) assert len(handler.messages) == 1 assert handler.messages[0].endswith(b"trace True")
def test_emit_ok(handler, framework): """ emit() with an OK level emits the message. """ logger = txaio.make_logger() old_log = txaio.get_global_log_level() txaio.set_global_log_level("trace") logger.emit("trace", "foobar") logger.emit("info", "barbaz") txaio.set_global_log_level(old_log) assert len(handler.messages) == 2 assert handler.messages[0].endswith(b"foobar") assert handler.messages[1].endswith(b"barbaz")
def reconfigServiceWithBuildbotConfig(self, new_config): if new_config.mq.get('type', 'simple') != "wamp": if self.app is not None: raise ValueError( "Cannot use different wamp settings when reconfiguring") return wamp = new_config.mq log.msg("Starting wamp with config: %r", wamp) router_url = wamp.get('router_url', None) realm = bytes2unicode(wamp.get('realm', 'buildbot')) wamp_debug_level = wamp.get('wamp_debug_level', 'error') # MQ router can be reconfigured only once. Changes to configuration are not supported. # We can't switch realm nor the URL as that would leave transactions in inconsistent state. # Implementing reconfiguration just for wamp_debug_level does not seem like a good # investment. if self.app is not None: if self.router_url != router_url or self.realm != realm or \ self.wamp_debug_level != wamp_debug_level: raise ValueError( "Cannot use different wamp settings when reconfiguring") return if router_url is None: return self.router_url = router_url self.realm = realm self.wamp_debug_level = wamp_debug_level self.app = self.serviceClass(url=self.router_url, extra=dict(master=self.master, parent=self), realm=realm, make=make) txaio.set_global_log_level(wamp_debug_level) yield self.app.setServiceParent(self) yield super().reconfigServiceWithBuildbotConfig(new_config)
def __init__(self, logger, url, header=None, **kwargs): """X-Ray WebSocket client base class Arguments: url: The URI of the endpoint where the device is connected """ # if necessary, convert serial to a unicode string u = urlparse(url) self.host = u.hostname if u.port: self.port = u.port else: if u.scheme == "ws": self.port = 80 else: self.port = 443 self.ws_factory = None self._logger = logger self._is_shutdown = False predicate = LogLevelFilterPredicate(LogLevel.error) try: if logger.isEnabledFor(logging.DEBUG): setDebugging(True) predicate = LogLevelFilterPredicate(LogLevel.debug) if logger.isEnabledFor(LOG_PROTOCOL_TRACE): txaio.set_global_log_level('trace') else: txaio.set_global_log_level('debug') else: txaio.set_global_log_level('info') except Exception as exc: logger.error(exc) globalLogPublisher.addObserver( FilteringLogObserver(STDLibLogObserver(name=logger.name), predicates=[predicate])) self.ws_factory = self.get_factory(url, header) self.ws_factory.d.addErrback(self._eb) if self.ws_factory.isSecure: contextFactory = ssl.ClientContextFactory() else: contextFactory = None def cleanup(): self.ws_factory.d.cancel() reactor.addSystemEventTrigger('after', 'shutdown', cleanup) connectWS(self.ws_factory, contextFactory)
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 __exit__(self, type, value, traceback): globalLogPublisher.removeObserver(self._got_log) set_global_log_level(self._old_log_level)
def __enter__(self): set_global_log_level(self.desired_level) globalLogPublisher.addObserver(self._got_log) return self
def tearDown(self): set_global_log_level(self.existing_level)
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 test_set_global(self): """ Setting the global log level via the function changes it. """ set_global_log_level("warn") self.assertEqual(get_global_log_level(), "warn")
def config_logging(suffix='', datadir=None, loglevel=None, config_desc=None): """Config logger""" try: from loggingconfig_local import LOGGING except ImportError: from loggingconfig import LOGGING if datadir is None: datadir = simpleenv.get_local_datadir("default") logdir_path = os.path.join(datadir, 'logs') for handler_name, handler in LOGGING.get('handlers', {}).items(): if 'filename' in handler: handler['filename'] %= { 'logdir': str(logdir_path), 'suffix': suffix, } skip_handler_names = ( 'error-file', 'sentry', 'sentry-metrics', ) if handler_name in skip_handler_names: # Don't modify loglevel in this handler continue if loglevel: handler['level'] = loglevel if loglevel: for _logger in LOGGING.get('loggers', {}).values(): _logger['level'] = loglevel LOGGING['root']['level'] = loglevel if config_desc and not config_desc.debug_third_party: LOGGING['loggers']['golem.rpc.crossbar']['level'] = 'WARNING' LOGGING['loggers']['twisted']['level'] = 'WARNING' try: if not os.path.exists(logdir_path): os.makedirs(logdir_path) logging.config.dictConfig(LOGGING) except (ValueError, PermissionError) as e: sys.stderr.write("Can't configure logging in: {} Got: {}\n".format( logdir_path, e)) return # Avoid consequent errors logging.captureWarnings(True) from golem.tools.talkback import enable_sentry_logger enable_sentry_logger(False) import txaio txaio.use_twisted() from ethereum import slogging if config_desc and config_desc.debug_third_party: slogging.configure(':debug') else: slogging.configure(':warning') from twisted.python import log observer = log.PythonLoggingObserver(loggerName='twisted') observer.start() crossbar_log_lvl = logging.getLevelName( logging.getLogger('golem.rpc.crossbar').level).lower() # Fix inconsistency in log levels, only warn affected if crossbar_log_lvl == 'warning': crossbar_log_lvl = 'warn' txaio.set_global_log_level(crossbar_log_lvl) # pylint: disable=no-member
def __enter__(self): set_global_log_level(self.desired_level) globalLogPublisher.addObserver(self.logs.append) return self
def __exit__(self, type, value, traceback): globalLogPublisher.removeObserver(self.logs.append) set_global_log_level(self._old_log_level)