Module elpis.trainer.utils

Expand source code
import logging
import sys
from contextlib import contextmanager
from logging.handlers import WatchedFileHandler
from pathlib import Path

from loguru import logger
from transformers.utils import logging as transformer_logging


@contextmanager
def log_to_file(log_file: Path):
    """A context manager which logs its captured runtime to the provided file."""
    sink_id = logger.add(log_file)

    handler = WatchedFileHandler(str(log_file))
    formatter = logging.Formatter(
        fmt="%(asctime)s.%(msecs)03d | %(levelname)s | (HF) %(name)s |   %(message)s",
        datefmt="%Y-%m-%d %H:%M:%S",
    )
    handler.setFormatter(formatter)
    handler.setLevel(logging.INFO)

    logging.root.addHandler(handler)

    # Propagate huggingface logs to logging root.
    transformer_logging.set_verbosity_info()
    transformer_logging.enable_propagation()
    transformer_logging.disable_default_handler()

    # Log stderr to log file to capture tqdm logs
    with open(log_file, "a") as stderr_hole:
        original_stderr = sys.stderr
        try:
            sys.stderr = stderr_hole
            yield log_file
        finally:
            sys.stderr = original_stderr
            # Flush and teardown logging handlers
            logger.remove(sink_id)
            handler.flush()
            logging.root.removeHandler(handler)

Functions

def log_to_file(log_file: pathlib.Path)

A context manager which logs its captured runtime to the provided file.

Expand source code
@contextmanager
def log_to_file(log_file: Path):
    """A context manager which logs its captured runtime to the provided file."""
    sink_id = logger.add(log_file)

    handler = WatchedFileHandler(str(log_file))
    formatter = logging.Formatter(
        fmt="%(asctime)s.%(msecs)03d | %(levelname)s | (HF) %(name)s |   %(message)s",
        datefmt="%Y-%m-%d %H:%M:%S",
    )
    handler.setFormatter(formatter)
    handler.setLevel(logging.INFO)

    logging.root.addHandler(handler)

    # Propagate huggingface logs to logging root.
    transformer_logging.set_verbosity_info()
    transformer_logging.enable_propagation()
    transformer_logging.disable_default_handler()

    # Log stderr to log file to capture tqdm logs
    with open(log_file, "a") as stderr_hole:
        original_stderr = sys.stderr
        try:
            sys.stderr = stderr_hole
            yield log_file
        finally:
            sys.stderr = original_stderr
            # Flush and teardown logging handlers
            logger.remove(sink_id)
            handler.flush()
            logging.root.removeHandler(handler)