Skip to content

Log Default

LogDefault is the built-in log provider. It supports file logging, console logging, or both, with simple text or JSON output format.

This is the provider used when no log is explicitly configured in Config.

Parameters

Parameter Values Default Description
level DEBUG, INFO, WARNING, ERROR INFO Minimum log level
output file, console, both console Where logs are written
path Any file path .output/flow.log Log file location (used with file or both)
format simple, json simple Message format

Basic example

Console output with simple format:

from dotflow import Config, DotFlow, action
from dotflow.providers import LogDefault


@action
def extract():
    return {"data": "fetched"}


@action
def transform(previous_context):
    return {"result": previous_context.storage}


def main():
    log = LogDefault(
        level="INFO",
        output="console",
        format="simple",
    )

    workflow = DotFlow(config=Config(log=log))
    workflow.task.add(step=extract)
    workflow.task.add(step=transform)
    workflow.start()

    return workflow


if __name__ == "__main__":
    main()

Output:

2026-04-07 14:31:07 - INFO [dotflow]: ID abc-123 - 01ARZ3NDEKTSV4RRFFQ69G5FAV - Not started
2026-04-07 14:31:07 - INFO [dotflow]: ID abc-123 - 01ARZ3NDEKTSV4RRFFQ69G5FAV - In progress
2026-04-07 14:31:07 - INFO [dotflow]: ID abc-123 - 01ARZ3NDEKTSV4RRFFQ69G5FAV - Completed

JSON format

JSON output to both console and file — useful for log aggregation tools (ELK, Loki, Datadog).

from dotflow import Config, DotFlow, action
from dotflow.providers import LogDefault


@action
def extract():
    return {"data": "fetched"}


@action
def transform(previous_context):
    return {"result": previous_context.storage}


def main():
    log = LogDefault(
        level="DEBUG",
        output="both",
        path=".output/pipeline.log",
        format="json",
    )

    workflow = DotFlow(config=Config(log=log))
    workflow.task.add(step=extract)
    workflow.task.add(step=transform)
    workflow.start()

    return workflow


if __name__ == "__main__":
    main()

Output:

{"timestamp": "2026-04-07T19:34:24.626Z", "level": "INFO", "workflow_id": "abc-123", "task_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV", "status": "Completed", "duration": 0.0001}

Log levels

Level Logged when
INFO Task status changes (Not started, In progress, Completed)
WARNING Task status changes to Retry
ERROR Task status changes to Failed (includes traceback)
DEBUG Available for custom use

References