optimum_benchmark/logging_utils.py (50 lines of code) (raw):
import logging
import logging.config
from subprocess import PIPE, STDOUT, Popen
from typing import List, Optional
def setup_logging(
level: str = "INFO",
to_file: bool = False,
use_colorlog: bool = True,
prefix: Optional[str] = None,
disable_existing_loggers: bool = False,
):
# base logging config
logging_config = {
"version": 1,
"handlers": {
"console": {"formatter": "simple", "stream": "ext://sys.stdout", "class": "logging.StreamHandler"},
},
"root": {"level": level, "handlers": ["console"]},
"disable_existing_loggers": disable_existing_loggers,
}
# formatters
logging_config["formatters"] = {
"simple": {"format": "[%(asctime)s][%(name)s][%(levelname)s] - %(message)s"},
}
# add file handler
if to_file:
logging_config["handlers"]["file"] = {
"formatter": "simple",
"filename": "benchmark.log",
"class": "logging.FileHandler",
}
logging_config["root"]["handlers"].append("file")
# use colorlog
if use_colorlog:
logging_config["formatters"]["colorlog"] = {
"()": "colorlog.ColoredFormatter",
"format": "[%(cyan)s%(asctime)s%(reset)s][%(blue)s%(name)s%(reset)s][%(log_color)s%(levelname)s%(reset)s] - %(message)s",
"log_colors": {"DEBUG": "purple", "INFO": "green", "WARNING": "yellow", "CRITICAL": "red", "ERROR": "red"},
}
for handler in logging_config["handlers"]:
logging_config["handlers"][handler]["formatter"] = "colorlog"
# format prefix
if prefix is not None:
for formatter in logging_config["formatters"]:
logging_config["formatters"][formatter]["format"] = (
f"[{prefix}]" + logging_config["formatters"][formatter]["format"]
)
logging.config.dictConfig(logging_config)
def run_subprocess_and_log_stream_output(logger: logging.Logger, args: List[str]) -> Popen:
popen = Popen(args, stdout=PIPE, stderr=STDOUT)
for line in iter(popen.stdout.readline, b""):
if line is not None:
logger.info(line.decode("utf-8").rstrip())
popen.wait()
return popen