Source code for testing.log_inspector

"""Inspect logs and output for errors and warnings."""

import logging
import re

_logger = logging.getLogger(__name__)


ERROR_PATTERNS = [
    re.compile(r"error", re.IGNORECASE),
    re.compile(r"exception", re.IGNORECASE),
    re.compile(r"traceback", re.IGNORECASE),
    re.compile(r"\b(failed to|has failed)\b", re.IGNORECASE),
    re.compile(r"runtime\s*warning", re.IGNORECASE),
    re.compile(r"segmentation fault", re.IGNORECASE),
]

IGNORE_PATTERNS = [re.compile(r"Falling back to 'utf-8' with errors='ignore'", re.IGNORECASE)]


[docs] def inspect(log_text): """ Inspect log text for errors and run-time warnings. Ignore any lines containing "INFO::" (to avoid false positives like "INFO:: Job error stream "). Parameters ---------- log_text: str or list of str Text of the log to inspect. Returns ------- bool True if no errors or warnings are found, False otherwise. """ log_text = log_text if isinstance(log_text, list) else [log_text] issues = [ (lineno, line) for txt in log_text for lineno, line in enumerate(txt.splitlines(), 1) if "INFO::" not in line and any(p.search(line) for p in ERROR_PATTERNS) and not any(p.search(line) for p in IGNORE_PATTERNS) ] for lineno, line in issues: _logger.error(f"Error or warning found in log at line {lineno}: {line.strip()}") return not issues