|
import os |
|
import time |
|
import logging |
|
|
|
|
|
def create_logger(logger_name: str, log_file_path: os.PathLike = None): |
|
""" |
|
Create a logger with the specified name and log file path. |
|
""" |
|
logger = logging.getLogger(logger_name) |
|
logger.propagate = False |
|
logger.setLevel(logging.DEBUG) |
|
assert log_file_path is not None, "log_file_path is required" |
|
fh = logging.FileHandler(log_file_path) |
|
fh_formatter = logging.Formatter("%(asctime)s : %(levelname)s, %(funcName)s Message: %(message)s") |
|
fh.setFormatter(fh_formatter) |
|
logger.addHandler(fh) |
|
logger.info(f"logging start: {logger_name}") |
|
return logger |
|
|
|
|
|
class Timer: |
|
""" |
|
A simple timer class for measuring elapsed time. |
|
""" |
|
|
|
def __init__(self, filename: os.PathLike = "timer_log.log", reset: bool = False): |
|
""" |
|
Initialize the Timer object. |
|
""" |
|
self.start_time = None |
|
self.last_checkpoint = None |
|
self.filename = filename |
|
self.logger = create_logger("Timer", filename) |
|
if reset: |
|
self._reset_log_file() |
|
|
|
def _reset_log_file(self): |
|
""" |
|
Reset the log file by clearing its contents. |
|
""" |
|
with open(self.filename, "w") as file: |
|
file.write("") |
|
|
|
def start(self): |
|
""" |
|
Start the timer. |
|
""" |
|
self.start_time = time.time() |
|
self.last_checkpoint = self.start_time |
|
self.logger.info("Timer started.") |
|
|
|
def check(self, message): |
|
""" |
|
Log a checkpoint with the current time and time since the last checkpoint. |
|
|
|
Args: |
|
message (str): The message to include in the log. |
|
""" |
|
if self.start_time is None: |
|
self.logger.warning("Timer has not been started.") |
|
else: |
|
log_message = ( |
|
f"Current time count: {time.time() - self.start_time:.4f} seconds, " |
|
f"Time since last checkpoint: {time.time() - self.last_checkpoint:.4f} seconds, " |
|
f"for {message}" |
|
) |
|
self.last_checkpoint = time.time() |
|
self.logger.info(log_message) |
|
|
|
def stop(self): |
|
""" |
|
Stop the timer and log the elapsed time. |
|
""" |
|
if self.start_time is None: |
|
self.logger.warning("Timer has not been started.") |
|
else: |
|
self.end_time = time.time() |
|
self.logger.info(f"Total elapsed time: {self.end_time - self.start_time} seconds\n") |
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
timer = Timer(filename="timer_log.log", reset=True) |
|
timer.start() |
|
timer.check("First checkpoint") |
|
time.sleep(1) |
|
timer.check("Second checkpoint") |
|
timer.stop() |
|
|