Source code for tardis.io.logger.logger

import logging
import sys

from tardis.io.logger.colored_logger import ColoredFormatter, formatter_message

logging.captureWarnings(True)
logger = logging.getLogger("tardis")

console_handler = logging.StreamHandler(sys.stdout)
console_formatter = ColoredFormatter()
console_handler.setFormatter(console_formatter)

logger.addHandler(console_handler)
logging.getLogger("py.warnings").addHandler(console_handler)

LOGGING_LEVELS = {
    "NOTSET": logging.NOTSET,
    "DEBUG": logging.DEBUG,
    "INFO": logging.INFO,
    "WARNING": logging.WARNING,
    "ERROR": logging.ERROR,
    "CRITICAL": logging.CRITICAL,
}
DEFAULT_LOG_LEVEL = "INFO"
DEFAULT_SPECIFIC_STATE = False


[docs]class FilterLog(object): """ Filter Log Class for Filtering Logging Output to a particular level Parameters ---------- log_level : logging object allows to have a filter for the particular log_level """ def __init__(self, log_level): self.log_level = log_level
[docs] def filter(self, log_record): """ filter() allows to set the logging level for all the record that are being parsed & hence remove those which are not of the particular level Parameters ---------- log_record : logging.record which the paricular record upon which the filter will be applied Returns ------- boolean : True, if the current log_record has the level that of the specified log_level False, if the current log_record doesn't have the same log_level as the specified one """ return log_record.levelno == self.log_level
[docs]def logging_state(log_level, tardis_config, specific_log_level): """ Function to set the logging configuration for the simulation output Called from within run_tardis() Configured via functional arguments passed through run_tardis() - log_level & specific_log_level Configured via YAML parameters under `debug` section - log_level & specific_log_level Parameters ---------- log_level: str Allows to input the log level for the simulation Uses Python logging framework to determine the messages that will be output specific_log_level: boolean Allows to set specific logging levels. Logs of the `log_level` level would be output. """ if "debug" in tardis_config: specific_log_level = ( tardis_config["debug"]["specific_log_level"] if specific_log_level is None else specific_log_level ) logging_level = ( log_level if log_level else tardis_config["debug"]["log_level"] ) # Displays a message when both log_level & tardis["debug"]["log_level"] are specified if log_level and tardis_config["debug"]["log_level"]: print( "log_level is defined both in Functional Argument & YAML Configuration {debug section}" ) print( f"log_level = {log_level.upper()} will be used for Log Level Determination\n" ) else: # Adds empty `debug` section for the YAML tardis_config["debug"] = {} if log_level: logging_level = log_level else: tardis_config["debug"]["log_level"] = DEFAULT_LOG_LEVEL logging_level = tardis_config["debug"]["log_level"] if not specific_log_level: tardis_config["debug"][ "specific_log_level" ] = DEFAULT_SPECIFIC_STATE specific_log_level = tardis_config["debug"]["specific_log_level"] logging_level = logging_level.upper() if not logging_level in LOGGING_LEVELS: raise ValueError( f"Passed Value for log_level = {logging_level} is Invalid. Must be one of the following {list(LOGGING_LEVELS.keys())}" ) # Getting the TARDIS logger & all its children loggers logger = logging.getLogger("tardis") # Creating a list for Storing all the Loggers which are derived from TARDIS tardis_loggers = tardis_logger() if logging_level in LOGGING_LEVELS: for logger in tardis_loggers: logger.setLevel(LOGGING_LEVELS[logging_level]) if logger.filters: for filter in logger.filters: for logger in tardis_loggers: logger.removeFilter(filter) if specific_log_level: filter_log = FilterLog(LOGGING_LEVELS[logging_level]) for logger in tardis_loggers: logger.addFilter(filter_log) else: for filter in logger.filters: for logger in tardis_loggers: logger.removeFilter(filter)
[docs]def tardis_logger(): """ Generates the list of the loggers which are derived from TARDIS All loggers which are of the form `tardis.module_name` are added to the list Parameters ---------- list_for_loggers : list List for storing the loggers derived from TARDIS Returns ------- list_for_loggers : list """ list_for_loggers = [] for name in logging.root.manager.loggerDict: if not name.find("tardis"): list_for_loggers.append(logging.getLogger(name)) return list_for_loggers