Source code for meerkat.logging.utils
import logging
import os
import tempfile
import uuid
from datetime import datetime
from pathlib import Path
from typing import Union
logger = logging.getLogger(__name__)
[docs]def initialize_logging(
log_dir: str = None,
log_name: str = "meerkat.log",
format: str = "[%(asctime)s][%(levelname)s][%(name)s:%(lineno)s] :: %(message)s",
level: int = logging.WARNING,
) -> None:
"""Initialize logging for Meerkat."""
# Generate a new directory using the log_dir, if it doesn't exist
date = datetime.now().strftime("%Y_%m_%d")
time = datetime.now().strftime("%H_%M_%S")
uid = str(uuid.uuid4())[:8]
if log_dir is None:
log_dir = os.environ.get("MEERKAT_LOG_DIR")
if log_dir is None:
success = False
# try potential logging directories until we find one with adequate permissions
for log_dir in [
tempfile.gettempdir(),
os.path.join(Path.home(), ".meerkat"),
]:
try:
log_path = os.path.join(log_dir, "log", date, time, uid)
os.makedirs(log_path, exist_ok=True)
success = True
except PermissionError:
pass
if not success:
raise PermissionError(
"Permission denied in all of Meerkat's default logging directories. "
"Set environment variable `MEERKAT_LOG_DIR` to specify a directory for "
"Meerkat logging."
)
else:
log_path = os.path.join(log_dir, "log", date, time, uid)
# Make the logdir
os.makedirs(log_path, exist_ok=True)
# Initialize logging
logging.basicConfig(
format=format,
level=level,
handlers=[
logging.FileHandler(os.path.join(log_path, log_name)),
logging.StreamHandler(),
],
)
# Set logging levels for dependencies
set_logging_level_for_imports()
logger.info("Logging initialized.")
[docs]def set_logging_level_for_imports(level: int = logging.WARNING) -> None:
"""Set logging levels for dependencies."""
# Set levels for imports
logging.getLogger("tensorflow").setLevel(level)
logging.getLogger("matplotlib").setLevel(level)
logging.getLogger("textattack").setLevel(level)
logging.getLogger("filelock").setLevel(level)
[docs]def set_logging_level(level: Union[int, str] = logging.INFO):
"""Set logging level for Meerkat."""
# Set the top-level logger
if isinstance(level, int):
logging.getLogger("meerkat").setLevel(level)
elif isinstance(level, str):
logging.getLogger("meerkat").setLevel(
{
"debug": logging.DEBUG,
"info": logging.INFO,
"warning": logging.WARNING,
"critical": logging.CRITICAL,
"fatal": logging.FATAL,
}[level]
)
else:
raise NotImplementedError(f"Level `{level}` not recognized.")