Source code for synkit.IO.debug
import os
import logging
import warnings
from rdkit import rdBase, RDLogger
[docs]
def setup_logging(
log_level: str = "INFO", log_filename: str = None, task_type: str = None
) -> logging.Logger:
"""Configures logging to either the console or a file, based on provided
parameters.
:param log_level: Logging level to set. Defaults to 'INFO'.
Options: 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'.
:type log_level: str
:param log_filename: If provided, logs are written to this file. Defaults to None (logs to console).
:type log_filename: str or None
:param task_type: Logger name/namespace. Useful for distinguishing loggers in multi-task settings.
Defaults to None.
:type task_type: str or None
:returns: Configured logger instance.
:rtype: logging.Logger
:raises ValueError: If an invalid log level is provided.
"""
log_format = "%(asctime)s - %(levelname)s - %(message)s"
numeric_level = getattr(logging, log_level.upper(), None)
if not isinstance(numeric_level, int):
raise ValueError(f"Invalid log level: {log_level}")
logger = logging.getLogger(task_type)
logger.handlers.clear() # Efficiently remove all existing handlers
if log_filename:
os.makedirs(os.path.dirname(log_filename), exist_ok=True)
logging.basicConfig(
level=numeric_level, format=log_format, filename=log_filename, filemode="a"
)
else:
logging.basicConfig(level=numeric_level, format=log_format)
return logger