From dec37349c641b48c4850fa498c59399a7a04034f Mon Sep 17 00:00:00 2001 From: Tamino Huxohl <thuxohl@techfak.uni-bielefeld.de> Date: Thu, 18 Aug 2022 09:43:53 +0200 Subject: [PATCH] add utilty class for logging --- mu_map/logging.py | 84 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 mu_map/logging.py diff --git a/mu_map/logging.py b/mu_map/logging.py new file mode 100644 index 0000000..ba76d7e --- /dev/null +++ b/mu_map/logging.py @@ -0,0 +1,84 @@ +import argparse +import datetime +import logging +import logging.handlers +import os +import shutil +from typing import Dict, Optional + + +FORMATTER = logging.Formatter( + fmt="%(asctime)s - %(levelname)s: %(message)s", datefmt="%m/%d/%Y %I:%M:%S" +) + + +def add_logging_args(parser: argparse.ArgumentParser, defaults: Dict[str, str]): + """ + Add logging arguments to an argument parser. This includes parameters for a + filename logged to and the log level. + """ + parser.add_argument( + "--logfile", + type=str, + default=defaults.get("--logfile", None), + help="the file information is logged to", + ) + parser.add_argument( + "--loglevel", + type=str, + default=defaults.get("--loglevel", "INFO"), + choices=["DEBUG", "INFO", "WARNING", "ERROR"], + help="the log level applied for printing logs", + ) + return parser + + +def timestamp_filename(filename: str): + timestamp = datetime.datetime.now().strftime("%Y-%m-%d-%H:%M:%S") + basename, ext = os.path.splitext(filename) + return f"{basename}_{timestamp}{ext}" + + +def rotate_log_file(filename: str): + if not os.path.isfile(filename): + return + + shutil.move(filename, timestamp_filename(filename)) + + +def get_logger(logfile: Optional[str] = None, loglevel: Optional[str] = None): + logger = logging.getLogger() + + if loglevel: + _level = getattr(logging, loglevel) + logger.setLevel(_level) + + _handler = logging.StreamHandler() + _handler.setFormatter(FORMATTER) + logger.addHandler(_handler) + + if logfile: + rotate_log_file(logfile) + _handler = logging.handlers.WatchedFileHandler(logfile) + _handler.setFormatter(FORMATTER) + logger.addHandler(_handler) + + return logger + + +def get_logger_by_args(args): + return get_logger(args.logfile, args.loglevel) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + add_logging_args(parser, defaults={"--loglevel": "DEBUG", "--logfile": "tmp.log"}) + args = parser.parse_args() + print(args) + + logger = get_logger_by_args(args) + + logger.info("This is a test!") + logger.warning("The training loss is over 9000!") + logger.error("This is an error") + logger.info("The end") -- GitLab