Skip to content

Logging

Each sci-etl-core module logs through the standard logging module, under a logger named after the module, such as sci_etl_core.pipeline_async or sci_etl_core.extractors.arxiv_async. All of them sit under the sci_etl_core logger. The library installs no handlers and sets no levels, so nothing is printed until the application configures logging:

import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(name)s: %(message)s",
    handlers=[logging.FileHandler("pipeline.log", encoding="utf-8"), logging.StreamHandler()],
)
logging.getLogger("sci_etl_core.extractors").setLevel(logging.WARNING)

The levels mean:

Level Used for
ERROR A sink or store fault the run reports: an exporter flush or aclose failed, state could not be flushed, a resource could not be closed, an event handler raised
WARNING Something that changes what the run produces or costs: a record failed or was skipped, a record was quarantined, a source stopped at its result cap or rejected a cursor, a memory backend failed, a download was unusable, a retry, a shutdown signal
INFO Routine notes: an entity or claim was rejected by validation, where a newest_first run resumed

Messages keep the wording earlier releases passed to logger= callables, such as Record processing failed: LLMError('...'), so a filter or alert written against them still matches.

The progress events in Observability remain the structured channel: count records, pages, and outcomes from the events, and use logs for the reasons.