Spaces:
Build error
Build error
| """Logging-related functionality""" | |
| import time | |
| import logging | |
| # Logging | |
| def init_logger(log_path): | |
| """Return a logger instance which logs to stdout and, if log_path is not None, also to a file""" | |
| logger = logging.getLogger("HOW") | |
| logger.setLevel(logging.DEBUG) | |
| stdout_handler = logging.StreamHandler() | |
| stdout_handler.setLevel(logging.INFO) | |
| stdout_handler.setFormatter(logging.Formatter('%(name)s %(levelname)s: %(message)s')) | |
| logger.addHandler(stdout_handler) | |
| if log_path: | |
| file_handler = logging.FileHandler(log_path) | |
| file_handler.setLevel(logging.DEBUG) | |
| formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s: %(message)s') | |
| file_handler.setFormatter(formatter) | |
| logger.addHandler(file_handler) | |
| return logger | |
| # Stopwatch | |
| class LoggingStopwatch: | |
| """Stopwatch context that produces one message when entered and another one when exited, | |
| with the time spent in the context embedded in the exiting message. | |
| :param str message: Message to be logged at the start and finish. If the first word | |
| of the message ends with 'ing', convert to passive for finish message. | |
| :param callable log_start: Will be called with given message at the start | |
| :param callable log_finish: Will be called with built message at the finish. If None, use | |
| log_start | |
| """ | |
| def __init__(self, message, log_start, log_finish=None): | |
| self.message = message | |
| self.log_start = log_start | |
| self.log_finish = log_finish if log_finish is not None else log_start | |
| self.time0 = None | |
| def __enter__(self): | |
| self.time0 = time.time() | |
| if self.log_start: | |
| self.log_start(self.message.capitalize()) | |
| def __exit__(self, exc_type, exc_val, exc_tb): | |
| # Build message | |
| words = self.message.split(" ") | |
| secs = "%.1fs" % (time.time() - self.time0) | |
| if words[0].endswith("ing"): | |
| words += [words.pop(0).replace("ing", "ed"), "in", secs] | |
| else: | |
| words += ["(%.1f)" % secs] | |
| # Log message | |
| if self.log_finish: | |
| self.log_finish(" ".join(words).capitalize()) | |