def duplicate_handlers(old_handlers, formatter): log_files = [] new_handlers = [] for handler in old_handlers: if isinstance(handler, logging.FileHandler): log_name = handler.baseFilename if log_name in log_files: continue log_files.append(log_name) task_file_out_handler = logging.FileHandler(log_name) task_file_out_handler.setFormatter(formatter) task_file_out_handler.setLevel(handler.level) new_handlers.append(task_file_out_handler) if isinstance(handler, MemoryHandler) and isinstance( handler.target, logging.FileHandler): log_name = handler.target.baseFilename if log_name in log_files: continue log_files.append(log_name) task_file_out_handler = logging.FileHandler(log_name, delay=True) task_file_out_handler.setFormatter(formatter) task_file_out_handler.setLevel(handler.level) task_mem_handler = MemoryHandler(handler.capacity, flushLevel=handler.flushLevel) task_mem_handler.setFormatter(formatter) task_mem_handler.setLevel(handler.level) task_mem_handler.setTarget(task_file_out_handler) new_handlers.append(task_mem_handler) return new_handlers
def add_buffer_handler( logger: logging.Logger, buffer_size: int = 100, flush_level: int = 1000, file_name: str = None, ): """ Adds a buffer handler to the logger. Useful for log files that are written to the output directory if that directory does not exist yet :param logger: The logger object :param buffer_size: The number of messages to buffer before a flush is forced :param flush_level: The minimum level of a message to cause the handler to be flushed early. Defaults to a value that won't be reached by normal log levels to prevent premature flushing :param file_name: The name of the log file to be used when it is available """ # Flush level should be high enough that flush is not called for regular messages buffer_handler = MemoryHandler(buffer_size, flushLevel=flush_level) if logger.name.startswith(THREADED): buffer_handler.setFormatter(general_threaded_formatter) else: buffer_handler.setFormatter(general_formatter) if file_name is not None: file_out_handler = logging.FileHandler(file_name, delay=True) if logger.name.startswith(THREADED): file_out_handler.setFormatter(general_threaded_formatter) else: file_out_handler.setFormatter(general_formatter) buffer_handler.setTarget(file_out_handler) logger.addHandler(buffer_handler)