code: # Copyright (c) Facebook, Inc. and its affiliates.
  # All rights reserved.
  #
  # This source code is licensed under the license found in the
  # LICENSE file in the root directory of this source tree.
  #
  
  import os
  import logging
  import time
  from datetime import timedelta
  import pandas as pd
  
  
  class LogFormatter:
      def __init__(self):
          self.start_time = time.time()
  
      def format(self, record):
          elapsed_seconds = round(record.created - self.start_time)
  
          prefix = "%s - %s - %s" % (
              record.levelname,
              time.strftime("%x %X"),
              timedelta(seconds=elapsed_seconds),
          )
          message = record.getMessage()
          message = message.replace("\n", "\n" + " " * (len(prefix) + 3))
          return "%s - %s" % (prefix, message) if message else ""
  
  
  def create_logger(filepath, rank):
      """
      Create a logger.
      Use a different log file for each process.
      """
      # create log formatter
      log_formatter = LogFormatter()
  
      # create file handler and set level to debug
      if filepath is not None:
          if rank > 0:
              filepath = "%s-%i" % (filepath, rank)
          file_handler = logging.FileHandler(filepath, "a")
          file_handler.setLevel(logging.DEBUG)
          file_handler.setFormatter(log_formatter)
  
      # create console handler and set level to info
      console_handler = logging.StreamHandler()
      console_handler.setLevel(logging.INFO)
      console_handler.setFormatter(log_formatter)
  
      # create logger and set level to debug
      logger = logging.getLogger()
      logger.handlers = []
      logger.setLevel(logging.DEBUG)
      logger.propagate = False
      if filepath is not None:
          logger.addHandler(file_handler)
      logger.addHandler(console_handler)
  
      # reset logger elapsed time
      def reset_time():
          log_formatter.start_time = time.time()
  
      logger.reset_time = reset_time
  
      return logger
  
  
  class PD_Stats(object):
      """
      Log stuff with pandas library
      """
  
      def __init__(self, path, columns):
          self.path = path
  
          # reload path stats
          if os.path.isfile(self.path):
              self.stats = pd.read_pickle(self.path)
  
              # check that columns are the same
              assert list(self.stats.columns) == list(columns)
  
          else:
              self.stats = pd.DataFrame(columns=columns)
  
      def update(self, row, save=True):
          self.stats.loc[len(self.stats.index)] = row
  
          # save the statistics
          if save:
              self.stats.to_pickle(self.path)
  
apis: pandas.read_pickle pandas.DataFrame