import logging import time from datetime import timedelta 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) def create_logger(filepath, args): # create log formatter log_formatter = LogFormatter() # create file handler and set level to debug 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 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 logger.info( "\n".join( "%s: %s" % (k, str(v)) for k, v in sorted(dict(vars(args)).items(), key=lambda x: x[0]) ) ) return logger