'Print out stats about how files are getting processed.
:param known_file_paths: a list of file paths that may contain Airflow
DAG definitions
:type known_file_paths: list[unicode]
:param processor_manager: manager for the file processors
:type stats: DagFileProcessorManager
:return: None'

def _log_file_processing_stats(self, known_file_paths, processor_manager):

    headers = [u'File    Path', u'PID', u'Runtime', u'Last    Runtime', u'Last    Run']
    rows = []
    for file_path in known_file_paths:
        last_runtime = processor_manager.get_last_runtime(file_path)
        processor_pid = processor_manager.get_pid(file_path)
        processor_start_time = processor_manager.get_start_time(file_path)
        runtime = ((datetime.now() - processor_start_time).total_seconds() if processor_start_time else None)
        last_run = processor_manager.get_last_finish_time(file_path)
        rows.append((file_path, processor_pid, runtime, last_runtime, last_run))
    rows = sorted(rows, key=(lambda x: (x[3] or 0.0)))
    formatted_rows = []
    for (file_path, pid, runtime, last_runtime, last_run) in rows:
        formatted_rows.append((file_path, pid, (u'{:.2f}s'.format(runtime) if runtime else None), (u'{:.2f}s'.format(last_runtime) if last_runtime else None), (last_run.strftime(u'%Y-%m-%dT%H:%M:%S') if last_run else None)))
    log_str = ((((((u'\n' + (u'=' * 80)) + u'\n') + u'DAG    File    Processing    Stats\n\n') + tabulate(formatted_rows, headers=headers)) + u'\n') + (u'=' * 80))
    self.logger.info(log_str)
