def test_init_logging(monkeypatch, is_verbose, log_level): """``_init_logging`` sets the logging module format and level.""" basic_config_mock = mock.MagicMock() config = {"verbose": is_verbose} monkeypatch.setattr(logging, "basicConfig", basic_config_mock) client._init_logging(config) basic_config_mock.assert_called_once_with( format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=log_level) assert logging.getLogger("taskcluster").level == logging.WARNING
def update_logging_config(config, log_name="", file_name="worker.log"): """Update python logging settings from config. * Use formatting from config settings. * Log to screen if ``verbose`` * Add a rotating logfile from config settings. Args: config (dict): the running config log_name (str, optional): the logger name to use. Primarily for testing. Defaults to ``""`` file_name (str, optional): the log file path to use. Defaults to ``"worker.log"`` """ _init_logging(config) top_level_logger = logging.getLogger(log_name) datefmt = config["log_datefmt"] fmt = config["log_fmt"] formatter = logging.Formatter(fmt=fmt, datefmt=datefmt) if config.get("verbose"): top_level_logger.setLevel(logging.DEBUG) else: top_level_logger.setLevel(logging.INFO) if len(top_level_logger.handlers) == 0: handler = logging.StreamHandler() handler.setFormatter(formatter) top_level_logger.addHandler(handler) # Rotating log file os.makedirs(config["log_dir"], exist_ok=True) path = os.path.join(config["log_dir"], file_name) if config["watch_log_file"]: # If we rotate the log file via logrotate.d, let's watch the file # so we can automatically close/reopen on move. handler = logging.handlers.WatchedFileHandler(path) else: # Avoid using WatchedFileHandler during notarization poller unittests handler = logging.FileHandler(path) handler.setFormatter(formatter) top_level_logger.addHandler(handler) top_level_logger.addHandler(logging.NullHandler())