Skip to main content

Logging

Added in v0.6. All DeepDiff DB commands emit structured, levelled log output. Logs can be written to stdout, a file, or both, and can be formatted as human-readable text or machine-parseable JSON.

Log Levels

LevelWhen it fires
debugDetailed operational data: per-batch hashing telemetry, query parameters, cursor values
infoNormal significant events: command started, table hashing started/completed, file written
warnUnexpected but handled events: schema drift on a table (data diff skipped), blocked DDL operation
errorFailures that abort the operation: connection failure, transaction rollback

The default level is info. Only messages at the configured level and above are emitted.

Flags

FlagDefaultDescription
--log-levelinfoMinimum log level: debug, info, warn, error
--log-formattextOutput format: text or json
--log-file(none)Write logs to this file path in addition to stdout
--verbosefalseShorthand for --log-level debug with source file and line number included in each log entry

Text Format

The default format is human-readable:

2026-03-21T10:05:00Z  INFO  Hashing table: orders (prod)
2026-03-21T10:05:02Z INFO Hashing table: orders (dev)
2026-03-21T10:05:04Z INFO Table orders: 42000 rows, 3 changes, 1 conflict
2026-03-21T10:05:04Z WARN Table invoices: schema drift detected, skipping data diff
2026-03-21T10:05:05Z INFO Migration pack written: diff-output/migration_pack.sql (31 statements)

JSON Format

Use --log-format json to emit newline-delimited JSON records — suitable for log aggregation pipelines (ELK, Datadog, Splunk, Loki):

{"level":"info","timestamp":"2026-03-21T10:05:00Z","service":"deepdiffdb","message":"Hashing table","table":"orders","database":"prod"}
{"level":"info","timestamp":"2026-03-21T10:05:04Z","service":"deepdiffdb","message":"Table hashed","table":"orders","rows":42000,"changes":3,"conflicts":1,"duration_ms":2103}
{"level":"warn","timestamp":"2026-03-21T10:05:04Z","service":"deepdiffdb","message":"Schema drift detected, skipping data diff","table":"invoices"}
{"level":"info","timestamp":"2026-03-21T10:05:05Z","service":"deepdiffdb","message":"Migration pack written","file":"diff-output/migration_pack.sql","statements":31}

Every JSON log entry includes at minimum: level, timestamp, service, and message. Additional context fields are appended depending on the operation.

Writing to a File

deepdiffdb gen-pack \
--config deepdiffdb.config.yaml \
--log-format json \
--log-level info \
--log-file /var/log/deepdiffdb/gen-pack-2026-03-21.log

Log file output is in addition to stdout — both destinations receive every log entry.

Debug Mode

Enable debug mode for maximum verbosity:

deepdiffdb diff --config deepdiffdb.config.yaml --verbose

Or equivalently:

deepdiffdb diff --config deepdiffdb.config.yaml --log-level debug

In debug mode, per-batch telemetry is emitted for every page of every table hash:

{"level":"debug","timestamp":"...","service":"deepdiffdb","message":"Batch hashed","table":"orders","batch":42,"rows_in_batch":10000,"total_rows_hashed":420000,"alloc_mb":14.2}

Using JSON Logs with Log Aggregators

Datadog

Configure the Datadog agent to tail the log file and parse it as JSON. The level field maps to Datadog's status attribute automatically.

ELK Stack (Filebeat)

Use Filebeat with the json.keys_under_root: true option to index all fields at the document root. Set up an index lifecycle policy on the deepdiffdb-* index pattern.

Grafana Loki

Use the Promtail json pipeline stage. Label on level and service for efficient log stream filtering.