| |
| |
| |
| |
| |
| |
|
|
| 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) if message else '' |
|
|
|
|
| def create_logger(filepath, rank): |
| """ |
| Create a logger. |
| Use a different log file for each process. |
| """ |
| |
| log_formatter = LogFormatter() |
|
|
| |
| 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) |
|
|
| |
| console_handler = logging.StreamHandler() |
| console_handler.setLevel(logging.INFO) |
| console_handler.setFormatter(log_formatter) |
|
|
| |
| 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) |
|
|
| |
| def reset_time(): |
| log_formatter.start_time = time.time() |
| logger.reset_time = reset_time |
|
|
| return logger |
|
|