Operator guide: consuming CLP logs#
This guide details how to configure internal log levels, capture service logs, and understand the component-specific log structures emitted by a running CLP deployment. The table below provides a high-level overview of the logging behaviors across all component families:
Component family |
Components |
Logger |
Format |
Level control |
|---|---|---|---|---|
Python orchestration services |
|
JSON |
|
|
Rust HTTP services |
|
|
JSON |
|
WebUI server |
Fastify server |
JSON or pretty text |
|
|
WebUI client |
Browser app |
Browser console |
Browser console output |
Browser/devtools dependent |
Native core binaries |
|
|
Text |
Binary-specific |
Package/setup tools |
Package controller, DB initialization scripts |
Python stdlib logging |
Text |
Script-specific |
Log level configuration#
This section covers how to modify logging verbosity for different components. Use the following environment variables and settings to filter logs for each component family:
Python orchestration services:
CLP_LOGGING_LEVELsupportsDEBUG,INFO,WARN,WARNING,ERROR, andCRITICAL. Missing or invalid values default toINFO.Rust HTTP services: Configure log filtering with tracing_subscriber::EnvFilter. Filter directives are read from the
RUST_LOGenvironment variable to determine which spans and events are enabled.log-ingestor: Log level is exposed viaCLP_LOG_INGESTOR_LOGGING_LEVEL(Docker Compose) orclpConfig.log_ingestor.logging_level(Helm), which is then passed toRUST_LOG.api-server: Log level is hardcoded toINFOand does not expose a deployment variable for configuration.
WebUI:
LOG_LEVELcontrols the Pino server log level (defaults toinfo).Warning
LOG_LEVELis a generic environment variable. Be mindful of environment variable collisions with other tools or container settings.
Log routing and collection#
Access to the CLP Package logs is entirely dependent on where the component is executed.
Containerized services#
For continuously running deployed services such as Python orchestration services, Rust HTTP services, and WebUI server, log routing depends on the orchestrator:
Docker Compose: Logs are available using
docker compose logs. IfCLP_LOGS_DIRis set, logs are additionally written to<CLP_LOGS_DIR>/<component_name>.log. This directory mounts to the host viaCLP_LOGS_DIR_HOST(defaults to./var/log).Note
For Rust services, setting
CLP_LOGS_DIRenables file logging with hourly log rotation and a non-blocking file writer.Kubernetes/Helm: Logs are accessible using
kubectl logsor a cluster log collector (e.g., Fluent Bit). File logging is only enabled for templates that setCLP_LOGS_DIRand mount a log volume.
Standalone tools#
Core binaries: Running standalone binaries (
clp,clp-s, etc.) emits unstructuredspdlogtext tostdout.Note
When deployed, Python orchestration services invoke these binaries as subprocesses. Consequently, the core binaries’ unstructured log text is captured and written to the Python logger’s output stream as a single multi-line JSON record. These appear alongside normal container logs in Docker or Kubernetes.
WebUI client: WebUI client (
console.*) logs remain local to the user’s browser devtools and are not captured by any backend telemetry service. They should be treated purely as local diagnostics.Package scripts: Package controller commands and one-shot setup scripts emit unstructured Python stdlib logs to
stdout.
Component-specific log schemas#
There is no single project-wide JSON schema. Python, Rust, and Pino logs are all line-delimited JSON in packaged non-interactive service runtimes, but each component family uses its own field names. The following sections describe the log schema for each component family.
Python orchestration services#
These services use clp_py_utils.clp_logging and emit one JSON object per log
record. Each record includes the following fields:
Field |
Description |
|---|---|
|
ISO-8601 UTC timestamp. |
|
Formatted log message. |
|
Logger name. |
|
Log level, emitted as values such as |
|
Source filename for the log call. |
|
Source function name for the log call. |
|
Source line number for the log call. |
|
Present when |
|
Present when |
Context variables |
Fields bound through structlog context variables. |
Extra fields |
Fields passed through stdlib logging’s |
Example:
{
"timestamp": "2026-06-22T17:03:21.123456Z",
"event": "Compression job 1 submitted.",
"logger": "compression_scheduler",
"level": "info",
"filename": "compression_scheduler.py",
"func_name": "main",
"lineno": 616
}
Rust HTTP services#
These services use clp_rust_utils::logging::set_up_logging, which configures
tracing_subscriber to emit one JSON object per log record. Each record includes the following
fields:
Field |
Description |
|---|---|
|
Timestamp emitted by |
|
Log level, emitted as values such as |
|
Structured |
|
Source filename for the log call. |
|
Source line number for the log call. |
Example:
{
"timestamp": "2026-06-26T13:06:48.621307",
"level": "INFO",
"fields": {
"message": "Spawned SQS listener task.",
"job_id": "3",
"task_id": "0"
},
"filename": "components/log-ingestor/src/ingestion_job/sqs_listener.rs",
"line_number": 320
}
WebUI server#
The WebUI server uses Fastify’s Pino logger. When the server runs without an interactive terminal,
such as in Docker Compose or Kubernetes, it emits one JSON object per log record. When stdout is
an interactive terminal, it uses pino-pretty for human-readable output.
Each JSON record includes the following fields:
Field |
Description |
|---|---|
|
Numeric Pino log level. |
|
Unix timestamp in milliseconds. |
|
Process ID. |
|
Hostname of the process emitting the log. |
|
Fastify request ID, when the record is request-scoped. |
|
Request and response metadata, when available. |
|
Request duration in milliseconds, when available. |
|
Log message. |
Extra fields |
Structured fields passed to the Pino log call. |
Example:
{
"level": 30,
"time": 1782480774533,
"pid": 1,
"hostname": "webui",
"reqId": "req-1h",
"res": {
"statusCode": 200
},
"responseTime": 1.0457000732421875,
"msg": "request completed"
}
Core and package tools#
Native core binaries emit unstructured spdlog text logs. Package controller commands and one-shot
setup scripts also emit unstructured Python stdlib logs. These tools do not follow the JSON log
formats described for Python orchestration services, Rust HTTP services, or the WebUI server.