def default_config(): """ Apply the default cocotb log formatting to the root logger. This hooks up the logger to write to stdout, using either :class:`SimColourLogFormatter` or :class:`SimLogFormatter` depending on whether colored output is requested. It also adds a :class:`SimTimeContextFilter` filter so that :attr:`~logging.LogRecord.created_sim_time` is available to the formatter. The logging level for cocotb logs is set based on the :envvar:`COCOTB_LOG_LEVEL` environment variable, which defaults to ``INFO``. If desired, this logging configuration can be overwritten by calling ``logging.basicConfig(..., force=True)`` (in Python 3.8 onwards), or by manually resetting the root logger instance, for which examples can be found online. """ # construct an appropriate handler hdlr = logging.StreamHandler(sys.stdout) hdlr.addFilter(SimTimeContextFilter()) if want_color_output(): hdlr.setFormatter(SimColourLogFormatter()) else: hdlr.setFormatter(SimLogFormatter()) logging.setLoggerClass(SimBaseLog) # For backwards compatibility logging.basicConfig() logging.getLogger().handlers = [hdlr] # overwrite default handlers # apply level settings for cocotb log = logging.getLogger('cocotb') level = os.getenv("COCOTB_LOG_LEVEL", "INFO") try: _default_log = getattr(logging, level) except AttributeError: log.error("Unable to set logging level to %r" % level) _default_log = logging.INFO log.setLevel(_default_log) # Notify GPI of log level, which it uses as an optimization to avoid # calling into Python. if "COCOTB_SIM" in os.environ: import simulator simulator.log_level(_default_log)
# GPI logging instance if "COCOTB_SIM" in os.environ: import simulator logging.basicConfig() logging.setLoggerClass(SimBaseLog) log = SimLog('cocotb') level = os.getenv("COCOTB_LOG_LEVEL", "INFO") try: _default_log = getattr(logging, level) except AttributeError as e: log.error("Unable to set loging level to %s" % level) _default_log = logging.INFO log.setLevel(_default_log) loggpi = SimLog('cocotb.gpi') # Notify GPI of log level simulator.log_level(_default_log) # If stdout/stderr are not TTYs, Python may not have opened them with line # buffering. In that case, try to reopen them with line buffering # explicitly enabled. This ensures that prints such as stack traces always # appear. Continue silently if this fails. try: if not sys.stdout.isatty(): sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 1) log.debug("Reopened stdout with line buffering") if not sys.stderr.isatty(): sys.stderr = os.fdopen(sys.stderr.fileno(), 'w', 1) log.debug("Reopened stderr with line buffering") except Exception as e: log.warning("Failed to ensure that stdout/stderr are line buffered: %s", e) log.warning("Some stack traces may not appear because of this.")