GenFBDD / utils /logging_utils.py
libokj's picture
Initial commit GenFBDD
9439b9b
import logging
import multiprocessing
import os
import subprocess
LOGGER_NAME = "DiffDock"
LOGLEVEL_KEY = "DIFFDOCK_LOGLEVEL"
def _get_formatter(loglevel="INFO"):
warn_fmt = "[%(asctime)s] %(levelname)s -%(message)s"
debug_fmt = "[%(asctime)s] [%(filename)s:%(lineno)d] %(levelname)s - %(message)s"
fmt = debug_fmt if loglevel.upper() in {"DEBUG", "INFO"} else warn_fmt
return logging.Formatter(
fmt=fmt,
datefmt="%Y-%b-%d %H:%M:%S %Z",
)
def remove_all_handlers(logger):
while logger.hasHandlers():
logger.removeHandler(logger.handlers[0])
def configure_logger(loglevel='INFO', logger_name=LOGGER_NAME, logfile=None):
"""Do basic logger configuration and set our main logger"""
logging.getLogger().setLevel(loglevel)
# Set as environment variable so other processes can retrieve it
if loglevel is None:
loglevel = os.environ.get(LOGLEVEL_KEY, "WARNING")
else:
os.environ[LOGLEVEL_KEY] = loglevel
logger = logging.getLogger(logger_name)
logger.setLevel(loglevel)
remove_all_handlers(logger)
logger.propagate = False
formatter = _get_formatter(loglevel)
def _prep_handler(handler):
for ex_handler in logger.handlers:
if type(ex_handler) == type(handler):
# Remove old handler, don't want to double-handle
logger.removeHandler(ex_handler)
handler.setLevel(loglevel)
handler.setFormatter(formatter)
logger.addHandler(handler)
sh = logging.StreamHandler()
_prep_handler(sh)
if logfile is not None:
fh = logging.FileHandler(logfile, mode="a")
_prep_handler(fh)
def get_logger(base_name=LOGGER_NAME):
"""
Return a logger.
Use a different logger in each subprocess, though they should all have the same log level.
"""
pid = os.getpid()
logger_name = f"{base_name}-process-{pid}"
logger = logging.getLogger(logger_name)
if not logger.hasHandlers():
configure_logger(logger_name=logger_name)
return logger
def get_git_revision_hash() -> str:
"""
Get the full git revision of the latest HEAD.
Note: This only works if run from git directory.
"""
return subprocess.check_output(["git", "rev-parse", "HEAD"]).decode("ascii").strip()
def get_git_revision_short_hash() -> str:
"""
Get the short git revision of the latest HEAD.
Note: This only works if run from git directory.
Returns:
"""
return (
subprocess.check_output(["git", "rev-parse", "--short", "HEAD"])
.decode("ascii")
.strip()
)
def check_git_uncommitted() -> bool:
changed_files = (
subprocess.check_output(["git", "status", "-suno"]).decode("ascii").strip()
)
lines = list(filter(lambda x: x, changed_files.split("\n")))
return len(lines) > 0